Description
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。Output
左上角到右下角的最短路径,格式如样例所示。Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)由于题目本身就是中文,就不解释了。最基础的BFS,但路径的记录需要注意。我用了两个数组prex[x][y],prey[x][y],来表示走到x,y这个点的点的坐标,在write函数中再找回去,把路径打印出来。不过后来想到,既然这样,可以直接从右下角走到左上角额。。。。。。。。就不用write那么麻烦了。至于POJ上有人说只有一组测试数据,把样例数据输出来就AC了,就当搞笑一下吧代码:#include <iostream> #include <stdio.h> #include <queue> using namespace std; struct point { int x; int y; } cur,now,ans[30]; queue<point> q; int grid[7][7]; int n=5,prex[7][7],prey[7][7]; void write() { int cnt,x2,y2,i,x3,y3; x2=n-1; y2=n-1; cnt=0; do//此处可优化 { ans[cnt].x=x2; ans[cnt].y=y2; x3=x2; y3=y2; x2=prex[x3][y3]; y2=prey[x3][y3]; cnt++; }while(x3!=0||y3!=0); for (i=cnt-1;i>=0;i--) { printf("(%d, %d)\n",ans[i].x,ans[i].y); } return; } void bfs() { int dirx[4]={-1,0,0,1},diry[4]={0,1,-1,0},x1,y1,x0,y0,i,flag; short vis[7][7]={0}; flag=0; while(1) { if (flag==1) { break; } cur=q.front(); x0=cur.x; y0=cur.y; q.pop(); for (i=0;i<=3;i++) { x1=x0+dirx[i]; y1=y0+diry[i]; if (x1==n-1&&y1==n-1) { prex[4][4]=x0; prey[4][4]=y0; write(); flag=1; break; } else if (grid[x1][y1]==0&&vis[x1][y1]==0&&x1>=0&&x1<=n-1&&y1>=0&&y1<=n-1) { now.x=x1; now.y=y1; prex[x1][y1]=x0; prey[x1][y1]=y0; vis[x1][y1]=1; q.push(now); } } } return; } int main() { int i,j; for(i=0;i<=n-1;i++) { for (j=0;j<=n-1;j++) { scanf("%d",&grid[i][j]); } } cur.x=0; cur.y=0; prex[0][0]=0; prey[0][0]=0; q.push(cur); bfs(); return 0; }