这有一个迷宫,有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,1
0表示道路,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
-
#include<stdio.h> #include<cstring> #include<iostream> using namespace std; int Maze[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} }; bool visited[9][9]; struct State { int x,y,step; }; struct Direction { int x,y; }; Direction d[5]={{0,0},{1,0},{0,1},{-1,0},{0,-1}}; void Total(int sx,int sy,int ex,int ey,int &min,int current); int main() { int n; scanf("%d",&n); while(n--) { memset(visited,false,sizeof(visited)); int startx,starty,endx,endy; scanf("%d%d%d%d",&startx,&starty,&endx,&endy); int minstep=10000; Total(startx,starty,endx,endy,minstep,0); cout<<minstep<<endl; } //system("pause"); } void Total(int sx,int sy,int ex,int ey,int &min,int current) //引用带回函数值 { if(sx==ex&&sy==ey) { if(current<min) min=current; return;} else { int i,di,dj; visited[sx][sy]=true; for(i=1;i<=4;++i) { di=sx+d[i].x; dj=sy+d[i].y; if(!Maze[di][dj]&&!visited[di][dj]) { Total(di,dj,ex,ey,min,current+1); visited[di][dj]=false; //回溯 } } } } 2.BFS广度搜索思路:采取队列思想,队列中的个数元素依次往四个方向搜索,最终得出解AC代码#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int Maze[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} }; bool visited[9][9]; struct State { int x,y,step; }; struct Direction { int x,y; }; Direction d[5]={{0,0},{1,0},{0,1},{-1,0},{0,-1}}; int Total(int,int,int,int); int main() { int n; scanf("%d",&n); while(n--) { int startx,starty,endx,endy,sum=0; scanf("%d%d%d%d",&startx,&starty,&endx,&endy); memset(visited,false,sizeof(visited)); cout<<Total(startx,starty,endx,endy)<<endl; } system("pause"); return 0; } int Total(int sx,int sy,int ex,int ey) { State SQueue[1000]; int front,rear,i,j,k,di,dj; front=rear=0; rear++; SQueue[rear].x=sx;SQueue[rear].y=sy; SQueue[rear].step=0; if(sx==ex&&sy==ey) return 0; visited[sx][sy]=true; while(front<rear) { front++; visited[SQueue[front].x][SQueue[front].y]=true; for(i=1;i<=4;++i) { di=SQueue[front].x+d[i].x; dj=SQueue[front].y+d[i].y; if(!Maze[di][dj]&&!visited[di][dj]) { rear++; SQueue[rear].x=di; SQueue[rear].y=dj; SQueue[rear].step=SQueue[front].step+1; //其步数等于其父结点的步数加1 if(di==ex&&dj==ey) return SQueue[rear].step; } } } }