最少步数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
-
输入
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
- 输出最少走几步。 样例输入
-
2 3 1 5 7 3 1 6 7
样例输出
-
12
11
-
思路分析:
-
这是一个搜索题,利用深搜,向四个方向不断的搜索,先把p赋一个很大的值,来回替换找最小步数,利用广搜,向四个方向搜索,若该点可以走
-
将该点压入栈中,否则舍弃,不断寻找,直到到达终止点或不可以走为止。
-
深搜代码:
-
广搜代码:#include<stdio.h> #include<string.h> int a,b,c,d,sum,p; int visit[9][9]; int map[9][9]={1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1}; void dfs(int k,int l,int sum) { if(k<0||k>8||l<0||l>8||sum>=p) return ;//判断是否越界 if(visit[k][l]!=0||map[k][l]!=0) return ;//判断该点是否能走 if(k==c&&l==d) { p=sum; return ; } visit[k][l]=1;//标记该点已走 dfs(k,l+1,sum+1);//向右搜 dfs(k+1,l,sum+1);//向下搜 dfs(k,l-1,sum+1);//向左搜 dfs(k-1,l,sum+1);//向上搜 visit[k][l]=0;//取消标记 } int main() { int n; scanf("%d",&n); while(n--){ scanf("%d%d%d%d",&a,&b,&c,&d); memset(visit,0,sizeof(visit)); p=100; dfs(a,b,0); printf("%d\n",p); } return 0; }
-
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> using namespace std; int sx,sy,ex,ey,sum; int vist[4][2]={1,0,-1,0,0,1,0,-1};//方向 int map[9][9]={1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1}; struct node{ int x,y; int temp; }; void bfs() { int dis[9][9]; memset(dis,0,sizeof(dis)); queue<node>q;//建立一个结构体队列q node p,n; n.x=sx; n.y=sy; n.temp =0; q.push(n);//将第一个放入队列 dis[sx][sy]=1;//标记 while(!q.empty())//判断队列是否为空 { n=q.front();//从队列中取出 q.pop();//清空队列 if(n.x ==ex&&n.y ==ey)//终止条件 { printf("%d\n",n.temp ); return ; } for(int i=0;i<4;i++)//判断四个方向 { int tx=n.x+vist[i][0]; int ty=n.y+vist[i][1]; if(tx>=0&&ty>=0&&tx<=8&&ty<=8&&map[tx][ty]==0&&dis[tx][ty]==0) { dis[tx][ty]=1;//标记该点已走 p.x=tx; p.y=ty; p.temp =n.temp +1; q.push(p); } } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&sx,&sy,&ex,&ey); bfs(); } return 0; }
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;