迷宫问题_BFS_挑战程序设计竞赛p34

Posted 多一份不为什么的坚持

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫问题_BFS_挑战程序设计竞赛p34相关的知识,希望对你有一定的参考价值。

 

给定一个N*M的迷宫,求从起点到终点的最小步数。

N,M<100;

输入:

10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

输出:

22

:在求最短路时使用宽度优先搜索。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 
 5 using namespace std;
 6 
 7 const int INF=100000000;
 8 
 9 typedef pair<int,int> P;
10 
11 char maze[200][200];
12 int N,M;
13 int sx,sy;
14 int gx,gy;
15 int d[200][200];
16 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
17 
18 int bfs(){
19     queue<P> que;
20     for(int i=0;i<N;i++){
21         for(int j=0;j<M;j++){
22             d[i][j]=INF;
23         }
24     }
25     que.push(P(sx,sy));
26     d[sx][sy]=0;
27 
28     while(que.size()){
29         P p=que.front();que.pop();
30         if(p.first==gx&&p.second==gy) break;
31 
32         for(int i=0;i<4;i++){
33             int nx=p.first+dx[i],ny=p.second+dy[i];
34             if(nx>=0 && nx<N && ny>=0 &&ny<M && maze[nx][ny]!=# && d[nx][ny]==INF){
35                 que.push(P(nx,ny));
36                 d[nx][ny]=d[p.first][p.second]+1;
37             }
38         }
39     }
40     return d[gx][gy];
41 }
42 
43 void solve(){
44     int res=bfs();
45     printf("%d\n",res);
46 }
47 
48 int main()
49 {
50     while(~scanf("%d %d",&N,&M)){
51         getchar();
52         for(int i=0;i<N;i++){
53             for(int j=0;j<M;j++){
54                 scanf("%c",&maze[i][j]);
55                 if(maze[i][j]==S){
56                     sx=i;
57                     sy=j;
58                 }
59                 if(maze[i][j]==G){
60                     gx=i;
61                     gy=j;
62                 }
63             }
64             getchar();
65         }
66         solve();
67     }
68     return 0;
69 }

 

以上是关于迷宫问题_BFS_挑战程序设计竞赛p34的主要内容,如果未能解决你的问题,请参考以下文章

《挑战程序设计竞赛》——BFS

挑战程序设计竞赛(算法和数据结构)——15.2拓扑排序(dfs,bfs)的JAVA实现

BFS简单题套路_Codevs 1215 迷宫

走迷宫_BFS

bfs_迷宫求最短路径

nefu558 bfs