解题思路: n皇后问题,就是考虑皇后放置的位置,对于每一行,需要枚举每个可以放置皇后的位置,我们需要判断当前位置(第i行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,如果冲突,说明这个位置不合适;则跳到下一列(注意是列),若还是冲突,继续跳到下一列,直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。 否则的话,就可以枚举下一行皇后的位置,直至第n行。
判断满足条件方法:预设即是行间不冲突,一维数组存棋盘,遍历当前列之前的列,若与该数相同,则列重复;若行数差绝对值=列数差绝对值,对角线重复。
具体代码如下:(hdu2553会超时,可能只能打表。。)
//N queens problem//TLE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int plain[12];
bool ifset(int i, int j)
{
for(int e = 1; e < i; e++)
{
if(plain[e]==j)
{
return false;
}
else if(abs(e-i)==abs(plain[e]-j))
{
return false;
}
}
return true;
}
int ans;
int s_ize;
void Nqueens(int h) //DFS
{
if(h==s_ize+1)
{
ans++;
return;
}
int flag = 0;
int l;
for(l = 1; l <= s_ize; l++)
{
if(ifset(h, l))
{
plain[h] = l;
flag = 1;
Nqueens(h+1);
}
}
if(l==s_ize+1 && !flag)
{
return;
}
}
void init(int n)
{
memset(plain, 0, sizeof(plain));
ans = 0;
s_ize = n;
}
int main()
{
int n;
while(scanf("%d", &n) && n)
{
init(n);
Nqueens(1);
printf("%d\n", ans);
}
return 0;
}