迷宫问题 模拟队列 广度优先搜索
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)
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 100 const int inf=0x7fffffff; //无限大 struct dota { int x; int y; int pre; } haha[1000]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; //int dp[10][10]; int vis[50][50]; void print(int x) { if(haha[x].pre!=-1) { print(haha[x].pre); printf("(%d, %d)\n",haha[x].x,haha[x].y); } } void bfs(int x,int y) { haha[0].x=x; haha[0].y=y; haha[0].pre=-1; int start=0; int fina=1; int m=1; while(start<fina) { for(int i=0;i<4;i++) { int a=haha[start].x+dx[i]; int b=haha[start].y+dy[i]; if(a<0||a>4) continue; if(b<0||b>4) continue; if(vis[a][b]==1) continue; fina++; vis[a][b]=1; haha[m].x=a; haha[m].y=b; haha[m++].pre=start; if(a==4&&b==4) { print(start); } } start++; } } int main() { for(int i=0;i<5;i++) for(int j=0;j<5;j++) { cin>>vis[i][j]; } printf("(0, 0)\n"); bfs(0,0); printf("(4, 4)\n"); return 0; }