题目
Description
小信是一个玩迷宫的高手,天下还没有能难住他的迷宫。但是总有人喜欢刁难小信,不停的给小信出难题。这个出题的人很聪敏,他知道天下还没有能难住小信的迷宫。所以他便转换思维问小信,在不走重复路径的情况下,总共有多少不同可以到达终点的路径呢?小信稍加思索便给出了答案,你要不要也来挑战一下?
Input
第一行输入两个整数 n(1 ≤ n ≤ 11), m(1 ≤ m ≤ 11).表示迷宫的行和列。
然后有一个 n × m 的地图,地图由'.'、'#'、's'、'e'这四个部分组成。'.'表示可以通行的路,'#'表示迷宫的墙,'s'表示起始点,'e'表示终点。
Output
输出一个整数,表示从's'到达'e'的所有方案数。
Sample Input 1
5 5
s####
.####
.####
.####
....e
Sample Output 1
1
一看这种关于迷宫的题,十有八九都是深搜(这不废话吗?)。
所以就开始DFS的老套路,4个方向轮番扩展,再把方案数加到一起,输出就行了。
话不多说,上代码:
#include <bits/stdc++.h>
using namespace std;
string mp[100];
int n,m,Tx,Ty,Sx,Sy;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool in(int x,int y){
return 0<=x&&x<n&&y>=0&&y<m;
}//判断边界
int vis[100][100];
int dfs(int x,int y){
if (x==Tx&&y==Ty){
return 1;
}
long long sum=0;
vis[x][y]=1;
for (int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];//4个方向轮番扩展
if (in(tx,ty)&&mp[x][y]!='#'&&!vis[tx][ty]){
sum+=dfs(tx,ty);//把方案数加到一起
}
}
vis[x][y]=0;//取消标记,因为万一这条路上还有可能呢?
return sum;
}
int main(){
cin >>n>>m;
for(int i=0;i<n;i++){
cin >> mp[i];
for (int j=0;j<m;j++){
if(mp[i][j]=='s'){
Sx=i;
Sy=j;
}
if(mp[i][j]=='e'){
Tx=i;
Ty=j;
}
}
}
cout << dfs(Sx,Sy);
return 0;
}