1255:迷宫问题

题目来源: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

原文地址:https://www.cnblogs.com/DarkValkyrie/p/10744708.html