走迷宫
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_
题目描述
一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数。
输入
第一行一个整数T 表示有T 组测试数据。(T <= 110)
对于每组测试数据:
第一行两个整数n, m,表示迷宫有n * m 个格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下来n 行,每行m 个数。其中第i 行第j 个数是0 表示第i 行第j 个格子可以走,否则是1 表示这个格子不能走,输入保证起点和终点都是都是可以走的。
任意两组测试数据间用一个空行分开。
输出
对于每组测试数据,输出一个整数R,表示有R 种走法。
示例输入
3 2 2 0 1 0 0 2 2 0 1 1 0 2 3 0 0 0 0 0 0
示例输出
1 0 4
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int visited[102][102]; 5 int m,n; 6 int f[102][102],sum; 7 int hang[4]={0,1,0,-1},lie[4]={1,0,-1,0}; 8 void dfs(int h,int l) 9 { 10 visited[h][l]=1; 11 int i; 12 for(i=0;i<=3;i++) 13 { 14 int h1=h+hang[i]; 15 int l1=l+lie[i]; 16 if(h1>=1&&h1<=m&&l1>=1&&l1<=n) 17 { 18 if(f[h1][l1]==0&&visited[h1][l1]!=1) 19 { 20 if(h1==m&&l1==n) 21 sum++; 22 else dfs(h1,l1); 23 } 24 } 25 } 26 visited[h][l]=0; 27 } 28 int main() 29 { 30 int zong; 31 cin>>zong; 32 while(zong--) 33 { 34 memset(visited,0,sizeof(visited)); 35 memset(f,1,sizeof(f)); 36 sum=0; 37 cin>>m>>n; 38 int i,j; 39 for(i=1;i<=m;i++) 40 for(j=1;j<=n;j++) 41 cin>>f[i][j]; 42 dfs(1,1); 43 cout<<sum<<endl; 44 } 45 return 0; 46 }