给一个 nn 行 mm 列的 22 维的迷宫,'S'
表示迷宫额起点,'T'
表示迷宫的终点,'#'
表示不能通过的点,'.'
表示可以通过的点。你需要从'S'
出发走到'T'
,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。
输入格式
第一行输入 nn, mm (1 \le n,m \le 10)(1≤n,m≤10) 表示迷宫大小。
接下来输入 nn 行字符串表示迷宫。
输出格式
输入通过迷宫的方法数。
样例输入1
2 3 S.# ..T
样例输出1
2
样例输入2
3 3 S.. .#. ..T
样例输出2
2
利用深搜 构建4种路径 走不通就return 走通就一直往下走 到终点是 计数器+1即可;
ac:
#include <bits/stdc++.h>
using namespace std;
int t[20][20],n,m,star_x,star_y,end_x,end_y,ans=0;
char pos[20][20];
void dfs(int x,int y)//x代表行 y代表列
{
if(x<1||x>n||y<1||y>m)//代表出了范围
return ;
if(pos[x][y]=='#')//代表该点是障碍或是起点
return ;
if(x==end_x&&y==end_y)//表示到达终点
{
ans++;
return ;
}
if(!t[x+1][y])//向下
{
t[x+1][y]=1;//代表该点已访问
dfs(x+1,y);
t[x+1][y]=0;
}
if(!t[x][y+1])//向右
{
t[x][y+1]=1;
dfs(x,y+1);
t[x][y+1]=0;
}
if(!t[x][y-1])//向左
{
t[x][y-1]=1;
dfs(x,y-1);
t[x][y-1]=0;
}
if(!t[x-1][y])//向上
{
t[x-1][y]=1;
dfs(x-1,y);
t[x-1][y]=0;
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
t[i][j]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>pos[i][j];
if(pos[i][j]=='S')
{
star_x=i;
star_y=j;
}
if(pos[i][j]=='T')
{
end_x=i;
end_y=j;
}
}
}
t[star_x][star_y]=1;
dfs(star_x,star_y);
cout<<ans;
return 0;
}