题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1255
1255:迷宫问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2306 通过数: 1038
【题目描述】
定义一个二维数组:
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)
解析:
这题是一个典型的迷宫型搜索题目,而且很简单,考查重点在于搜索时记录前驱节点并输出这一块。这部分我使用的是数组储存+递归输出路径。
参考代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<string> 7 #include<cstdlib> 8 #include<queue> 9 #include<vector> 10 #define INF 0x3f3f3f3f 11 #define PI acos(-1.0) 12 #define N 10010 13 #define MOD 2520 14 #define E 1e-12 15 using namespace std; 16 bool vis[10][10]; 17 int a[10][10],pre[N]; 18 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 19 struct node{ 20 int x,y; 21 }q[N]; 22 void print(int tail)//递归输出路径,由于我更习惯从1开始计数 23 { //而题目是从0开始,所以。。。 24 if(pre[tail]!=tail) print(pre[tail]); 25 cout<<"("<< q[tail].x-1<<", "<<q[tail].y-1<<")"<<endl; 26 } 27 void bfs(int i,int j) 28 { 29 int head=0,tail=1; 30 q[tail].x=i;q[tail].y=j; 31 pre[tail]=tail; 32 memset(vis,0,sizeof(vis)); 33 do 34 { 35 head++; 36 for(int i=0;i<4;i++) 37 { 38 int nx=q[head].x+dir[i][0]; 39 int ny=q[head].y+dir[i][1]; 40 if(nx>0&&nx<=5&&ny>0&&ny<=5&&vis[nx][ny]==0&&a[nx][ny]!=1) 41 { 42 tail++; 43 q[tail].x=nx; 44 q[tail].y=ny; 45 pre[tail]=head; 46 vis[nx][ny]=1; 47 } 48 if(nx==5&&ny==5){print(tail);return;} 49 } 50 }while(head<tail); 51 } 52 int main() 53 { 54 for(int i=1;i<=5;i++) 55 for(int j=1;j<=5;j++) 56 scanf("%d",&a[i][j]); 57 if(a[5][5]==1) return 0;//剪枝(逃 58 bfs(1,1); 59 return 0; 60 }
2019-04-21 12:37:37