迷宮問題(dfs)

問題 1672: 迷宮問題

時間限制: 1Sec 內存限制: 32MB

題目描述
小明置身於一個迷宮,請你幫小明找出從起點到終點有多少種走法。
小明只能向上下左右四個方向移動。
輸入
輸入包含多組測試數據。輸入的第一行是一個整數T,表示有T組測試數據。
每組輸入的第一行是兩個整數N和M(1<=N,M<=100)。
接下來N行,每行輸入M個字符,每個字符表示迷宮中的一個小方格。
字符的含義如下:
‘s’:起點
‘e’:終點
‘-.:空地,可以通過
‘#’:障礙,無法通過
輸入數據保證有且僅有一個起點和終點。
輸出
對於每組輸入,輸出多少中走法,如果不存在從起點到終點的路,則輸出-1。
樣例輸入:
在這裏插入圖片描述
樣例輸出:
1
分析:利用深搜統計即可

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int m,n;
int ans=0;//記錄次數 
bool vis[1005][1005];
int dir[4][2]{{-1,0},{0,-1},{1,0},{0,1}};
string mp[1005];
bool in(int x,int y){
	return x>=0&&x<m&&y>=0&&y<n;
}
void dfs(int x,int y){
	if(mp[x][y]=='e'){
		ans++;
		return;
	}
	vis[x][y]=true;
	for(int i=0;i<4;i++){
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];
		if(in(tx,ty)&&!vis[tx][ty]&&mp[tx][ty]!='#'){
			dfs(tx,ty);
		}
	}
	vis[x][y]=false;
} 
int main(){
	cin>>m>>n;
	int x,y;
	for(int i=0;i<m;i++){
		cin>>mp[i];
	}
	for(int i=0;i<m;i++){//找到起點 
		for(int j=0;j<n;j++){
			if(mp[i][j]=='s'){
				 x=i;
				 y=j;
			}
		}
	}
	dfs(x,y);
	if(ans>0)
	cout<<ans<<endl;
	else
	printf("-1");
	return 0;
} 

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章