用三个bool数组分别记录每个纵向有无皇后~~以及左右两个45度的斜方向分别有无皇后~~两个斜的一个是x+y来确定唯一~~一个是x-y来确定唯一~~但x-y会小于0...就x-y+n..

    然后就直接搜罗~~只有f1[],f2[],f3[]都是false也就是对应的都没有皇后时才能放....

    很奇怪的问题是...开始我交上去WA了...但本地测错误的这组数据没有问题..和要求的一样~~.后来发现是一个数组开小了...但它开小了我本地真的不会出任何问题~~明明爆了...要注意要注意....~=。=....

Program:

/*  
ID: zzyzzy12
LANG: C++
TASK: checker
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
bool f1[30],f2[30],f3[30];
int n,num,s[30];
void search(int k)
{
int i;
if (k>n)
{
num++;
if (num<=3)
{
for (i=1;i<n;i++) printf("%d ",s[i]);
printf("%d\n",s[n]);
}
return;
}
for (i=1;i<=n;i++)
if (!f1[i] && !f2[i+k] && !f3[i-k+n])
{
s[k]=i;
f1[i]=f2[i+k]=f3[i-k+n]=true;
search(k+1);
f1[i]=f2[i+k]=f3[i-k+n]=false;
}
}
int main()
{
freopen("checker.in","r",stdin);
freopen("checker.out","w",stdout);
scanf("%d",&n);
memset(f1,false,sizeof(f1));
memset(f2,false,sizeof(f2));
memset(f3,false,sizeof(f3));
num=0;
search(1);
printf("%d\n",num);
return 0;
}