一個由n * m 個格子組成的迷宮,起點是(1, 1), 終點是(n, m),每次可以向上下左右四個方向任意走一步,并且有些格子是不能走動,求從起點到終點經(jīng)過每個格子至多一次的走法數(shù)。
對于每組測試數(shù)據(jù):
第一行兩個整數(shù)n, m,表示迷宮有n * m 個格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下來n 行,每行m 個數(shù)。其中第i 行第j 個數(shù)是0 表示第i 行第j 個格子可以走,否則是1 表示這個格子不能走,輸入保證起點和終點都是都是可以走的。
任意兩組測試數(shù)據(jù)間用一個空行分開。
32 20 10 02 20 11 02 30 0 00 0 0Example Output
104#include<stdio.h>#include<string.h>#include<stdlib.h>#define max 7int book[max][max];int df[max][max];int count,n,m;void dfs(int x,int y){ int i,tx,ty; if(x==n&&y==m) { count++; return ; } int next[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; for(i=0;i<4;i++) { tx=x+next[i][0]; ty=y+next[i][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(df[tx][ty]!=1&&book[tx][ty]==0) { book[tx][ty]=1; dfs(tx,ty); book[tx][ty]=0; } }}int main(){ int t,i,j; scanf("%d",&t); while(t--) { count=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&df[i][j]); } } book[1][1]=1; dfs(1,1); printf("%d/n",count); } return 0;}
新聞熱點
疑難解答