問題 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;
}
運行結果: