迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11844 | Accepted: 7094 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
bfs+记录之前的路径,输出时递归输出就可以了。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <queue> #pragma warning(disable:4996) using namespace std; int value[7][7]; int pre[7][7]; int flag[7][7]; void bfs() { memset(flag,0,sizeof(flag)); memset(pre,-1,sizeof(pre)); queue<int>x; queue<int>y; while(x.size())x.pop(); while(y.size())y.pop(); x.push(0); y.push(0); int a; int b; while(x.size()) { a=x.front(); b=y.front(); x.pop(); y.pop(); flag[a][b]=1; if(a>0&&flag[a-1][b]==0&&value[a-1][b]==0) { pre[a-1][b]=a*10+b; x.push(a-1); y.push(b); } if(b<4&&flag[a][b+1]==0&&value[a][b+1]==0) { pre[a][b+1]=a*10+b; x.push(a); y.push(b+1); } if(b>0&&flag[a][b-1]==0&&value[a][b-1]==0) { pre[a][b-1]=a*10+b; x.push(a); y.push(b-1); } if(a<4&&flag[a+1][b]==0&&value[a+1][b]==0) { pre[a+1][b]=a*10+b; x.push(a+1); y.push(b); } } } void prin(int x,int y) { if(pre[x][y]!=-1) { int y_pr=pre[x][y]%10; int x_pr=pre[x][y]/10; prin(x_pr,y_pr); } cout<<"("<<x<<", "<<y<<")"<<endl; } int main() { int i,j; for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { cin>>value[i][j]; } } bfs(); prin(4,4); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。