迷宫问题
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1255
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
【输入】
一个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
【输出样例】
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; queue <int> Q; int a[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int mp[6][6]; int j[6][6][2]; int bfs() { int flag=0; while(!Q.empty()) { if(flag)return 0; int x=Q.front();Q.pop(); int y=Q.front();Q.pop(); for(int i=0;i<4;i++) { int x1=x+a[i][0],yy1=y+a[i][1]; if(x1>0&&x1<6&&yy1>0&&yy1<6&&!mp[x1][yy1]) { mp[x1][yy1]=mp[x][y]+1; j[x1][yy1][0]=x;j[x1][yy1][1]=y; if(x1==5&&yy1==5){ flag=1;break; } Q.push(x1);Q.push(yy1); } } } } int show(int x,int y) { if(x==1&&y==1)return 0; show(j[x][y][0],j[x][y][1]); printf("(%d, %d) ",j[x][y][0]-1,j[x][y][1]-1); } int main() { for(int i=1;i<6;i++) for(int j=1;j<6;j++) { cin>>mp[i][j]; if(mp[i][j])mp[i][j]=-1; } Q.push(1);Q.push(1); mp[1][1]=1; bfs(); show(5,5); printf("(4, 4) "); }