迷宮的最短路徑

在這裏插入圖片描述
輸入樣例: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;
}
發佈了120 篇原創文章 · 獲贊 63 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章