题目:有长度为L的探测管,从坐标(X,Y)为起点对周围水管进行探测。水管形状如下

红色数字代表水管型号,输入第一行T,代表T个样例;
第二行输入N,代表图的大小N*N;
第三行输入探测管的起始探测的坐标(X,Y)以及长度L;
以下N行输入数字,0代表没有水管,1~7代表如上水管形状;测试样例如下,(3,3)为起始探测点,探测管长度为7,五角星记为能探测到的管子,一共有17根管子可以探测到;
输出最多能探测多少根水管。(本样例中探测起点不算长度,实际考试具体忘了算不算。测试样例是手编样例,不是考试样例。水管形状对应的数字也为手编)
1
6
3 3 7
6 4 1 3 5 0
3 7 6 4 2 0
0 4 3 1 4 5
4 2 4 1 2 2
7 7 1 7 3 6
1 0 7 2 2 4
完整代码:
- // 管道.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
- //
-
- #include
- using namespace std;
- //探测管长度,探测的管道数
- int L,step=0,n;
- //管道
- int pipe[101][101];
- //标记管道是否被走过
- int book[101][101];
- //管子种类(方向分布:右下左上)
- int category[9][5] = {
- {0,0,0,0},{1,1,1,1},{0,1,0,1},{1,0,1,0},{1,1,0,0},{0,1,1,0},{0,0,1,1},{1,0,0,1}
- };
- //1表示通,0表示不通
- struct queue {
- int x;
- int y;
- int step;
- }Q[10001];
-
- //置零操作
- void init() {
- for(int i=1;i<=n;i++)
- for (int j = 1;j <= n;j++) {
- book[i][j] = 0;
- pipe[i][j] = 0;
- }
- }
- //判断当前管道的方向能否与上一个管道方向对应
- int direction(int nextdir,int k) {
- //判断这个管道与k相反的方向是否为1
- //首先判断k的相反方向
- int nek;
- switch (k) {
- case 0:nek = 2;break;
- case 1:nek = 3;break;
- case 3:nek = 1;break;
- case 2:nek = 0;break;
- }
- //cout<
-
- return category[nextdir][nek];
- }
- void BFS(int startx,int starty) {
-
- int next[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };//右下左上
- //队列初始化
- int head = 0, tail = 0;
- Q[head].x = startx;
- Q[head].y = starty;
- Q[head].step=0;
- book[startx][starty]=1;
- tail++;
-
- //判断起点管道种类pipe[startx][starty]
- int tx,ty;
- while(Q[head].step <=L) {
- //cout<
- int newpipe=pipe[Q[head].x][Q[head].y];
- //cout<
- //判断当前有几个方向可以走
- for (int k = 0;k < 4;k++) {
- //该类管道在category中的行数(因为从0开试)
-
- //如果当前管道的方向为1,说明是通路可以去下一个
-
- if (category[newpipe][k] == 1) {
- //新的坐标
- tx = Q[head].x + next[k][0];
- ty = Q[head].y + next[k][1];
-
-
- //判断边界
- if(tx>=1&&ty>=1&&tx<=n&&ty<=n){
- //判断新坐标是否能走 能走则入队
- if (direction(pipe[tx][ty],k)==1&&book[tx][ty]==0) {
-
- //做标记 已走过
- book[tx][ty]=1;
- //新的坐标入队
- Q[tail].x = tx;
- Q[tail].y = ty;
- cout<
- tail++;
- //探测到的管道数+1,第一个不算后面要减一
- Q[tail].step=Q[head].step+1;
- step++;
- //探测管长度--
-
-
-
- }
- }
- }
- }
-
- head++;
-
- }
-
-
- return;
- }
- int main()
- {
- int i, j, T,startx,starty;
- cin >> T;
- //T组样例
- for (i = 1;i <= T;i++) {
- cin >> n;
- //输入起点坐标和探测管长度
- cin >> startx >> starty >> L;
-
- //输入管道地图
- for (int p = 1;p <= n;p++)
- for (int q = 1;q <= n;q++)
- cin >> pipe[p][q];
- BFS(startx, starty);
- cout<
1; -
- for(int i=0;i<8;i++){
-
- for (int j = 0;j < 4;j++) {
- cout<
- }
- cout<
- }
- //cout<
- init();
- step = 0;
-
- }
- return 0;
- }
-
相关阅读:
【前端三栏布局总结】常见的前端三栏布局有哪些
实现打印功能
开发者驱动的软件公司,如何赚取万亿美元?
多线程案例——阻塞式队列
HMS Core基于地理位置请求广告,流量变现快人一步
Tomcat服务启动失败:java.lang.OutOfMemoryError: Java heap space
公益培训报名小程序
ps神经网络滤镜安装包,ps神经网络滤镜用不了
日常学习记录随笔-大数据之日志(hadoop)收集实战
超级哇塞的快排,你值得学会!
-
原文地址:https://blog.csdn.net/qq_63533863/article/details/126180986