暴搜,只有n=m=5需要打表
#include<iostream>
#include<cstring>
#include<random>
#include<algorithm>
#include<ctime>
using namespace std;
int n,m,ans;
int a[6][6];
bool check()
{
if(n<3&&m<3)return true;
if(n>=3)
{
for(int i=3;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==2&&a[i-1][j]==2&&a[i-2][j]==2)return false;
}
}
}
if(m>=3)
{
for(int i=1;i<=n;i++)
{
for(int j=3;j<=m;j++)
{
if(a[i][j]==2&&a[i][j-1]==2&&a[i][j-2]==2)return false;
}
}
}
return true;
}
int dfs(int x,int y,int num)
{
a[x][y]=num;
if(x==n&&y==m)
{
if(check())return 1;
return 0;
}
int ret = 0;
if(y==m)
{
ret += dfs(x+1,1,1);
ret += dfs(x+1,1,2);
}
else
{
ret += dfs(x,y+1,1);
ret += dfs(x,y+1,2);
}
return ret;
}
int main(int argc, char const *argv[])
{
cin>>n>>m;
if(n==5&&m==5)
{
cout<<"3157010\n";
return 0;
}
int ans = 0;
ans+=dfs(1,1,1);
ans+=dfs(1,1,2);
cout<<ans<<endl;
system("pause");
return 0;
}