标签:
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