枚举第一行状态,对每一行下一行状态就是当前行取反,这时你已经将横着放的都放过了,那么只用考虑竖着放的即可.
#include<iostream>
#include<string.h>
#define LL long long
using namespace std;
LL h,w;
LL dp[20][1<<14];
void dfs(LL nw,LL ni,LL s,LL fu)
{
if(ni==h)
{
dp[nw][s]+=fu;
return;
}
dfs(nw,ni+1,s,fu);
if(!(s&1<<ni) && !(s&1<<ni+1) && ni+2<=h)
dfs(nw,ni+2,s|1<<ni|1<<ni+1,fu);
}
int main()
{
while(1)
{
cin>>h>>w;
if(h==0&&w==0) break;
memset(dp,0,sizeof(dp));
dfs(1,0,0,1);
//for(LL i=0;i<=(1<<m)-1;i++)
//cout<<dp[1][i]<<" ";
//cout<<endl;
LL len=(1<<h)-1;
for(LL i=2;i<=w;i++)
{
for(LL j=0;j<=len;j++)
{
if(!dp[i-1][j])
continue;
dfs(i,0,~j&len,dp[i-1][j]);
}
}
cout<<dp[w][len]<<endl;
}
return 0;
}