【题意】这题也是醉了,其实不用怎么剪枝啊,只需要把m==0的情况列个表,还一直以为m==1的时候列表,好毒。
【分析】就是普通的n皇后问题,由于可能有一个点已经有皇后,开始的时候标记就行啦!其实暴力,全部打表也可以,可是还是不会呀!
【AC代码】
#include <stdio.h> #include <ctype.h> #include <string.h> #include <iostream> #include <algorithm> 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; }