给一个 nnn 行 mmm 列的 222 维的迷宫,'S'
表示迷宫额起点,'T'
表示迷宫的终点,'#'
表示不能通过的点,'.'
表示可以通过的点。你需要从'S'
出发走到'T'
,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。
输入格式
第一行输入 nnn, mmm (1≤n,m≤10)(1 \le n,m \le 10)(1≤n,m≤10) 表示迷宫大小。
接下来输入 nnn 行字符串表示迷宫。
输出格式
输入通过迷宫的方法数。
样例输入1
2 3 S.# ..T
样例输出1
2
样例输入2
3 3 S.. .#. ..T
样例输出2
2
#include <string>
using namespace std;
char arr[15][15];
int visted[15][15];
int n,m,method=0;
int xx[4]={-1,1,0,0};int yy[4]={0,0,-1,1};//上下左右
void dfs(int x,int y)
{
int nx,ny;
if(arr[x][y]=='T')
{
method++;
visted[x][y]=0;//没有的话
return;
}
visted[x][y]=-1;//标记为访问过;
for(int i=0;i<4;i++)
{
nx=x+xx[i];ny=y+yy[i];
if(nx<0 || nx>=n ||ny<0 || ny>=m || visted[nx][ny]==-1 ||arr[nx][ny]=='#')//不合法的下一步
continue;
//cout<<nx<<" "<<ny<<endl;
dfs(nx,ny);
}
visted[x][y]=0;
}
int main()
{
int i,j,start,end;
cin>>n>>m;
for(i=0;i<n;i++)
cin>>arr[i];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(arr[i][j]=='S') {start=i;end=j;}
//dfs(0,0);错误了
dfs(start,end);
cout<<method;
return 0;
}
后记:
/*
两种方法可以使用:
定义二维数组char a[10][100];
1 输入字符串方式。
如果二维数组的每一行均为字符串,那么可以采用cin>>a[n]的形式输入,每次输入为数组的一行。
2 输入字符方式。
如果要存储的并不是字符串,而是可能包含空白字符,如换行符,制表符,空格等字符的字符串,就需要按字符输入,可以使用
a[m][n] = cin.get();
的方式,输入每个元素。
*/