[code=Cpp width=740px]
#include <stdio.h>
int a[12][12],all=0;
int n,m;
void dfs(int x,int y,int fx)
{
int i,j;
if(x==n && y==m+1)//注意这个地需要搜索到a[n][m+1]的地方,而不能搜索到a[n][m]
{
all++;
return;
}
if(x>n || y>m)//越界剪纸
return;
if(a[x][y]==5)//树的情况
return;
if(fx==1)//入口方向在上面
{
if(a[x][y]==0)//没有限制
{
dfs(x,y+1,2);
dfs(x+1,y,1);
}
if(a[x][y]==1)//只能使用1号管子
dfs(x,y+1,2);//这里注意,如果使用1号管子,那么下一个格子的入口将是2
if(a[x][y]==4)//只能使用4号管子
dfs(x+1,y,1);
}
if(fx==2)////入口方向在左边
{
if(a[x][y]==0)
{
dfs(x,y+1,2);
dfs(x+1,y,1);
}
if(a[x][y]==2)
dfs(x+1,y,1);
if(a[x][y]==3)
dfs(x,y+1,2);
}
return;
}
int main()
{
freopen("trase.in","r",stdin);
freopen("trase.out","w",stdout);
int i,j;
scanf("%d %d",&m,&n);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&a[j]);
}
dfs(1,1,1);//三个参数分别表示,当前格子的x坐标,y坐标,和这个格子的入口方向
printf("%d",all);
return 0;
}
</stdio.h>[/code]
|