貌似状压题目放方块类型的已经木问题了。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
const int MAXN =20;
int n,m;
LL dp[MAXN][1<<10];
int sc[MAXN][1<<10],nsc[MAXN];
int get_len(LL num)
{
int res=0;
while(num)
{
res++;
num/=10;
}
return res;
}
void dfs(int line,int sta,int next_line_sta,int pos)
{
if(pos>=m)
{
if(dp[line+1][next_line_sta]==0)sc[line+1][nsc[line+1]++]=next_line_sta;
dp[line+1][next_line_sta]+=dp[line][sta];
//cout<<line<<" "<<get_len(dp[line+1][next_line_sta])<<endl;
return ;
}
if(sta&(1<<pos))dfs(line,sta,next_line_sta,pos+1);
else
{
int lef=(pos>0)?(1<<(pos-1)):0;
int down = 1<<pos;
int rig=1<<(pos+1);
if(pos+1<m&&((sta&(1<<(pos+1)))==0))
{
dfs(line,sta,next_line_sta,pos+2);
if((next_line_sta&rig)==0)
dfs(line,sta,next_line_sta|rig,pos+2);
if((next_line_sta&down)==0)
dfs(line,sta,next_line_sta|down,pos+2);
}
if((next_line_sta&down)==0)
{
dfs(line,sta,next_line_sta|down,pos+1);
}
if(pos>0)
{
if((next_line_sta&(lef|down))==0)
{
dfs(line,sta,next_line_sta|(lef|down),pos+1);
}
}
if(pos+1<m)
{
if((next_line_sta&(rig|down))==0)
{
dfs(line,sta,next_line_sta|(rig|down),pos+1);
}
}
}
}
void solve()
{
memset(dp,0,sizeof(dp));
memset(nsc,0,sizeof(nsc));
sc[1][nsc[1]++]=0;
dp[1][0]=1;
for(int line=1;line<=n;line++)
{
for(int j=0;j<nsc[line];j++)
{
dfs(line,sc[line][j],0,0);
}
}
cout<<dp[n+1][0]<<endl;
}
int main()
{
while(cin>>n>>m)
{
solve();
}
return 0;
}