码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫的最短路径

时间:2016-06-28 09:26:51      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

 1 //给定一个大小为N*M的迷宫,迷宫由通道和墙壁组成,每一步可以向邻接
 2 //的上下左右四格的通道移动。请求出从起点到终点的最小部署,本题假设
 3 //从起点一定可以移动到终点
 4 //input
 5 //    N=10,M=10
 6 //#S######.#
 7 //......#..#
 8 //.#.##.##.#
 9 //.#........
10 //##.##.####
11 //....#....#
12 //.#######.#
13 //....#.....
14 //.####.###.
15 //....#...G#
16 //output
17 //22
18 
19 #include "iostream"
20 #include "queue"
21 
22 using namespace std;
23 
24 const int INF=10000000;
25 //使用pair表示状态时,使用typedef会更加方便一些
26 typedef pair<int,int> P;
27 const int MAX_N=1000;
28 char maze[MAX_N][MAX_N];
29 int N,M;
30 int sx,sy;//起点坐标
31 int gx,gy;//终点坐标
32 int d[MAX_N][MAX_N];//最短距离
33 int dx[4]={1,0,-1,0};
34 int dy[4]={0,1,0,-1};
35 
36 int bfs()
37 {
38     queue<P> que;
39     for(int i=0;i<N;i++)
40         for(int j=0;j<M;j++)
41         {
42             d[i][j]=INF;
43             if(maze[i][j]==S) sx=i,sy=j;
44             if(maze[i][j]==G) gx=i,gy=j;
45         }
46     que.push(P(sx,sy));
47     d[sx][sy]=0;
48 
49     while(que.size())
50     {
51         P p=que.front();
52         que.pop();
53         if(p.first==gx&&p.second==gy) break;
54         for(int i=0;i<4;i++)
55         {
56             int nx=p.first+dx[i],ny=p.second+dy[i];
57             if(0<nx&&nx<N&&0<=ny&&ny<M&&maze[nx][ny]!=#&&d[nx][ny]==INF)
58             {
59                 que.push(P(nx,ny));
60                 d[nx][ny]=d[p.first][p.second]+1;
61             }
62         }
63     }
64     return d[gx][gy];
65 }
66 
67 void solve()
68 {
69     int res=bfs();
70     cout<<res<<endl;
71 }
72 
73 int main(int argc, char const *argv[])
74 {
75     cin>>N>>M;
76     for(int i=0;i<N;i++)
77         for(int j=0;j<M;j++)
78         {
79             cin>>maze[i][j];
80         }
81     solve();
82     return 0;
83 }

 

迷宫的最短路径

标签:

原文地址:http://www.cnblogs.com/qinduanyinghua/p/5622187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!