正题
题目链接:http://poj.org/problem?id=2411
题目大意
有n×mn×m的矩阵,用1×21×2的方块填满有多少种方法。
解题思路
用1表示竖着的块的上面,其他都是0。
我们先计算出所有单排合法状态(横着的都是连续的偶数)。
然后我们用statei or statei−1stateiorstatei−1就是所有横着的方块就是0,然后判断是否合法,然后statei and statei−1stateiandstatei−1就是所有竖着的不合法的方块就是1。
然后判断。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
bool state[1<<11];
long long f[12][1<<11];
int main()
{while(scanf("%d%d",&n,&m)&&n){for(int i=0;i<1<<m;i++){bool cnt=0,has_odd=0;for(int j=0;j<m;j++)if(i>>j&1)has_odd|=cnt,cnt=0;else cnt^=1;state[i]=has_odd|cnt?0:1;//统计合法情况}f[0][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<1<<m;j++){f[i][j]=0;for(int k=0;k<1<<m;k++)if((j&k)==0&&state[j|k])//判断是否合法f[i][j]+=f[i-1][k];//累计答案}printf("%lld\n",f[n][0]);}
}