题目见:HDU2553
用递归的思想求解N皇后问题,主要考虑的是每一行都放一个皇后。
所以递归的想法就是每一行考虑,如考虑第k行,那就只要前面的k-1行已经确定,所以是从第一行开始递归下来。
这题主要还有一个陷进,一定要打表,因为N≤10。不打表会超时。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<memory>
#include<cstring>
using namespace std;
int sum;
int n;
int queenPos[100];
int ans[15];
void nQueen(int k) //认为第0到k-1行已经排好了
{
if(k==n)
{
sum++;
//return;
/*
for(int i = 0;i < n;i++)
{
printf("%d",queenPos[i]+1);
if(i < n-1)
printf(" ");
}
printf("\n");
*/
}
for(int i = 0;i < n;i++) //摆放在第i列
{
int j;
for(j = 0;j < k;j++) //看前k-1行的有没有冲突
{
if(queenPos[j]==i || abs(queenPos[j]-i)==abs(k-j))
break;
}
if(j==k)
{
queenPos[k] = i;
nQueen(k+1);
}
}
}
//打表
void queenAns(int n)
{
nQueen(0);
ans[n] = sum;
}
int main()
{
memset(ans,0,sizeof(ans));
//先打表
for(n = 1;n <= 10;n++)
{
sum = 0;
queenAns(n);
}
int N;
while(cin >> N)
{
if(N==0)
break;
cout << ans[N] << endl;
}
return 0;
}