提议表述:使用1*2的瓷砖来铺满n*m的墙面;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int state(int x){//判断是不是可以选择平放(连续的1是不是2的倍数)
int ans = 0;
while(x){
if(x & 1)
ans ++;
else
{
if(ans & 1)
return 0;
}
x = x >> 1;
}
return !(ans & 1);
}
long long dp[20][4000];
int main()
{
int n,m,i,j,B,C;
while(scanf("%d %d",&n,&m) && (n || m))
{
memset(dp,0,sizeof(dp));
if((n*m) & 1)
cout << 0 << endl;
else{
for(B = 0;B < (1 << m);B ++)
dp[1][B] = (long long)state(B);//对第一行的情况进行判断,这要可以有横放的情况就是 1;
for(i = 2;i <= n;i ++)
for(B = 0;B < (1 << m);B ++)
for(C = 0;C < (1 << m);C ++)
if((B | C) == ((1 << m) - 1) && state(B & C))//对于当前的状态B,他可以由多少种的上一行的C转化而来的,就是当前情况的不同组成///所以加上;
dp[i][B] += dp[i-1][C];
cout << dp[n][(1 << m)-1] << endl;
}
}
return 0;
}