Description
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
现在后宫是N*N棋盘,有N个皇后,问有多少种摆法让她们互相不攻击。
Input
第一行数据组数,不大于100。
接下来每行一个数N。N不超过14
Output
每组数据1行。
Sample Input
2
2
8
Sample Output
0
92
解析:这是典型的八皇后问题,回溯法的应用即可,不过n的数据有限,不能太大了
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int tot,n;
int vis[3][1000];//这里的变量范围要大些,否则容易出错
void search( int cur)
{
int i,j;
if(cur==n)tot++;//边界条件
else
for(i=0;i<n;i++)
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])/第i行放置一个,判断是否满足条件
{vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
search(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;//这里是回溯法的特征
}
}
}
int main()
{
//freopen("out4.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{memset(vis,0,sizeof(vis));
scanf("%d",&n);
tot=0;
search(0);
printf("%d\n",tot);
}
return 0;
}