给一个 n行 m 列的 2 维的迷宫,'S'表示迷宫额起点,'T'表示迷宫的终点,'#'表示不能通过的点,'.' 表示可以通过的点。你需要从'S'出发走到'T',每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。
输入格式
第一行输入 n, m (1≤n,m≤10) 表示迷宫大小。
接下来输入 n行字符串表示迷宫。
输出格式
输入通过迷宫的方法数。
样例输入1
2 3
S.#
..T
样例输出1
2
样例输入2
3 3
S..
.#.
..T
样例输出2
2
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10;
char a[N+5][N+5];
int flag[N+5][N+5];
int cnt=0;
int n,m;
void dfs(int x,int y)
{
if(x<0||y<0||x>=n||y>=m)
{
return;
}
if(a[x][y]=='#')
{
return;
}
if(a[x][y]=='T')
{
cnt++;
return;
}
if(!flag[x+1][y])//向右走
{
flag[x+1][y]=1;
dfs(x+1,y);
flag[x+1][y]=0;
}
if(!flag[x][y+1])//向上走
{
flag[x][y+1]=1;
dfs(x,y+1);
flag[x][y+1]=0;
}
if(!flag[x-1][y])//向左走
{
flag[x-1][y]=1;
dfs(x-1,y);
flag[x-1][y]=0;
}
if(!flag[x][y-1])//向下走
{
flag[x][y-1]=1;
dfs(x,y-1);
flag[x][y-1]=0;
}
return;
}
int main()
{
memset(flag,0,sizeof(flag));
int sx,sy,ex,ey;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]=='S')
{
sx=i;
sy=j;
}
}
}
flag[sx][sy]=1;
dfs(sx,sy);
cout<<cnt<<endl;
return 0;
}