[poj3984]迷宫问题_bfs
迷宫问题
题目大意:给你一个5*5的矩阵,求左上角到左下角的最短路径。
注释:0或1的矩阵,1表示不能走,0表示能走,保证有唯一最短路径。
想法:bfs爆搜练习题。通过其实点,定义方向数组,然后进行bfs遍历即可。
最后,附上丑陋的代码... ...
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; struct Pair { int x,y; }; int a[10][10]; queue<Pair> q; Pair before[10][10]; Pair ans[50]; bool dis[10][10]; int d[5][3]={{0,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; bool check(int x,int y)//判断当前点是否合法 { if(x>=0&&x<=4&&y>=0&&y<=4&&a[x][y]==0) return true; return false; } int main() { for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { scanf("%d",&a[i][j]); } } Pair mid; mid.x=0; mid.y=0; q.push(mid);//起始暴搜点 dis[0][0]=1; while(!q.empty()) { mid=q.front();q.pop(); int x=mid.x,y=mid.y; if(x==4&&y==4) break; for(int i=1;i<=4;i++) { if(check(x+d[i][1],y+d[i][2])&&dis[x+d[i][1]][y+d[i][2]]==false) { dis[x+d[i][1]][y+d[i][2]]=1; Pair c; c.x=x+d[i][1];c.y=y+d[i][2]; q.push(c);before[c.x][c.y]=mid; } } } Pair k; k.x=4,k.y=4; int cnt=0; ans[++cnt]=k; bool flag=false; while(1) { if(flag) break; k=before[k.x][k.y]; ans[++cnt]=k; if(!k.x&&!k.y) flag=true; } for(int i=cnt;i>=1;i--)//答案要求从左上角输出至右下角 { printf("(%d, %d)\n",ans[i].x,ans[i].y); } return 0; }
小结:水题,注意bfs时需要pop以及边界特判。方向数组的第二维如果从一开始有意义的话需要多写一个0.
| 欢迎来原网站坐坐! >原文链接<