迷宫最短路径
1226: 迷宮最短路徑
時間限制: 1 Sec??內存限制: 128 MB提交: 1??解決: 1
[提交][狀態][討論版]????? [Edit]????? [TestData]??????
題目描述
給定一個大小為N*M的迷宮。迷宮有通道和墻壁組成,每一步可以向上下左右是個方向移動。求起點到終點的最短路
M,N<=100.
輸入
創建迷宮。
輸出
輸出最短路長度。樣例輸入
10 10#S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G#樣例輸出
22 ? ? #include <cstdio> #include <iostream> #include <utility> #include <queue> #include <cstring> #define maxn 505 using namespace std; const int INF = 10000000; typedef pair<int,int> PA; //輸入 char maze[maxn][maxn+1]; //迷宮字符串 int n,m; //行列 int sx,sy; //起點 int gx,gy; //終點 int d[maxn][maxn]; //到各個位置的最短距離數組//4個方向移動的向量 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//求從{sx,sy}到{gx,gy}的最短距離 //如果無法到達,則是INF int bfs(){queue<PA> que;//memset(d,INF,sizeof(d)); //位置初始化為INF//不能用memset for (int i = 0; i < n; i++) for (int j = 0; j <m; j++) d[i][j] = INF;//將起點加入隊列 ,并將這一地點的距離設置為0 que.push(PA(sx,sy));d[sx][sy]=0;//不斷循環直到隊列的長度為0while(que.size()){PA p=que.front();que.pop();//如果取出的狀態已經是終點,則結束搜索if(p.first==gx&&p.second==gy) break; //四個方向循環for(int i=0;i<4;i++){//移動之后的位置為(nx,ny)int nx=p.first+dx[i];int ny=p.second+dy[i]; //判斷是否可以移動以及是否已經訪問過(d=INF訪問過) if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==INF){//可以移動的話加入到隊列,并且到該位置的距離確定為到p的距離+1que.push(PA(nx,ny));d[nx][ny]=d[p.first][p.second]+1; } }}return d[gx][gy]; } int main(){while(cin>>n>>m){for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>maze[i][j];if(maze[i][j]=='S'){sx=i,sy=j;}else if(maze[i][j]=='G'){gx=i;gy=j;}}printf("%d\n",bfs());}return 0; }總結
- 上一篇: 七步从Angular.JS菜鸟到专家(1
- 下一篇: 平行四边形数