【题意】这题也是醉了,其实不用怎么剪枝啊,只需要把m==0的情况列个表,还一直以为m==1的时候列表,好毒。
【分析】就是普通的n皇后问题,由于可能有一个点已经有皇后,开始的时候标记就行啦!其实暴力,全部打表也可以,可是还是不会呀!
【AC代码】
using namespace std;
const int maxn = 14;
int vis[4][30];
int ans[14] = {0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712};
int n,m,x,y,sum;
void dfs(int dep)
{
if(dep==n)
{
sum++;
return ;
}
if(vis[0][dep])
dfs(dep+1);
else
{
for(int i=0;i<n;i++)
{
if(!vis[1][i]&&!vis[2][dep-i+n]&&!vis[3][dep+i])
{
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=1;
dfs(dep+1);
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=0;
}
}
}
}
//void dfs(int dep)
//{
// if(dep==n)
// {
// if(m==0)sum++;
// else if(m==1&&C[x]==y)
// {
// sum++;
// }
// }
// else
// for(int i=0;i<n;i++)
// {
// int ok=1;
// C[dep]=i;
// for(int j=0;j<dep;j++)
// {
// if(C[dep]==C[j]||dep-C[dep]==j-C[j]||dep+C[dep]==j+C[j])
// {
// ok=0;
// break;
// }
// }
// if(ok)dfs(dep+1);
// }
//}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(m==0)
{
printf("%d\n",ans[n]);
continue;
}
if(m==1)scanf("%d%d",&x,&y);
memset(vis,0,sizeof(vis));
if(m==1)
{
vis[0][x]=1;
vis[1][y]=1;
vis[2][x-y+n]=1;
vis[3][x+y]=1;
}
sum = 0;
dfs(0);
printf("%d\n",sum);
}
return 0;
}