链接:https://ac.nowcoder.com/acm/contest/301/B
来源:牛客网
题目描述
小乐乐想要给自己搭建一个积木城堡。
积木城堡我们假设为n*m的平面矩形。
小乐乐现在手里有1*2,2*1两种地砖。
小乐乐想知道自己有多少种组合方案。
输入描述:
第一行输入整数n,m。(1<=n,m<=10)
输出描述:
输出组合方案数。
示例1
输入
2 3
输出
3
说明
示例2
输入
1 3
输出
0
示例3
输入
2 5
输出
8
分析:dfs类型,不断搜索每一个点看是否可以拼一块,搜索方向为向下和向右,当面积为奇数时比如n=1,m=3此时不能拼完,组合方式为0。
代码如下:
#include<stdio.h>
int book[11][11],n,m,s,d,s1,dir[3][2]={{0,1},{1,0}};
void dfs(int pos,int cut)
{
if(pos==s)
{
if(cut==s1)
d++;
return ;
}
int x=pos/m+1,y=pos%m,i,tx,ty;
if(pos%m==0)
{
y=m;
x=x-1;
}
if(book[x][y])
{
dfs(pos+1,cut);
return ;
}
for(i=0;i<=1;i++)
{
tx=x+dir[i][0];
ty=y+dir[i][1];
if(tx<=n&&ty<=m&&book[tx][ty]==0)
{
book[x][y]=1;
book[tx][ty]=1;
dfs(pos+1,cut+1);
book[x][y]=0;
book[tx][ty]=0;
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
s=n*m;
if(s%2)
{
printf("0\n");
return 0;
}
s1=s/2;
dfs(1,0);
printf("%d\n",d);
return 0;
}