暴力dfs搜索,注意return的位置,如果枚举完四种放法不return的话那么就会空出一行
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int ans;
bool fg;
int n;
int vis[11][11];
bool check(int x,int y)
{
if(!vis[x][y]&&x>=1&&x<=n&&y>=1&&y<=4) return true;
return false;
}
void dfs(int k)
{
if(k==4*n&&fg){ans++;return;}
if(k>=4*n){return;}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
if(check(i,j)&&check(i,j+1)&&check(i+1,j)&&check(i+1,j+1)&&!fg)
{
fg=1;
vis[i][j]=vis[i+1][j]=vis[i][j+1]=vis[i+1][j+1]=1;
dfs(k+4);
fg=0;
vis[i][j]=vis[i+1][j]=vis[i][j+1]=vis[i+1][j+1]=0;
}
if(check(i,j)&&check(i,j+1))
{
vis[i][j]=vis[i][j+1]=1;
dfs(k+2);
vis[i][j]=vis[i][j+1]=0;
}
if(check(i,j)&&check(i+1,j))
{
vis[i][j]=vis[i+1][j]=1;
dfs(k+2);
vis[i][j]=vis[i+1][j]=0;
}
if(check(i,j))
{
vis[i][j]=1;
dfs(k+1);
vis[i][j]=0;
return;
}
}
}
}
int main()
{
int T;cin>>T;
while(T--)
{
cin>>n;
ans=0;
fg=0;
memset(vis,0,sizeof(vis));
dfs(0);
printf("%d\n",ans);
}
return 0;
}