輸入樣例:10 10
#S######.#
…#…#
.#.##.##.#
.#…
##.##.####
…#…#
.#######.#
…#…
.####.###.
…#…G#
思路:bfs按照距開始狀態由近及遠的順序搜索,適合求最短路路徑、最少操作問題;這個問題中,狀態只是位置座標,可構造pair表達,當狀態更復雜時,需要封裝成結構體。
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2;
const int inf=1e8;//一般將inf設爲放大2~4倍不會溢出的大小
typedef pair<int,int>P;//使用pair表示狀態時,使用typedef更方便
char maze[maxn][maxn+1];
int N,M,d[maxn][maxn];//d爲到各個位置最短距離的數組
int sx,sy,gx,gy;//起點座標和終點座標
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs(){//求(sx,sy)到(gx,gy)的最短距離,若無法到達則爲inf
queue<P>q;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) d[i][j]=inf;
q.push(P(sx,sy));
d[sx][sy]=0;
while(!q.empty()){
P p=q.front();q.pop();
if(p.first==gx&&p.second==gy) break;//若爲終點,搜索結束
for(int i=0;i<4;i++){//通過一個循環實現4個方向的遍歷
int nx=p.first+dx[i],ny=p.second+dy[i];//移動之後的位置記爲(nx,ny)
if(0<=nx&&nx<N&&0<=ny&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==inf){//判斷是否可以移動以及是否訪問過(d!=inf爲訪問過)
q.push(P(nx,ny));//相鄰點加入隊列
d[nx][ny]=d[p.first][p.second]+1;//更新距離
}
}
}
return d[gx][gy];
}
int main(){
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;//起點座標
if(maze[i][j]=='G') gx=i,gy=j;
}
cout<<bfs();
return 0;
}