N皇后问题

Problem Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input

共有若干行,每行一个正整数N<=12,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

Sample Input

1
8
5
0

Sample Output

1
92
10

#include<stdio.h>
#include<math.h>
#include<algorithm>
int n;
int cnt;
int arr[15];
bool is(int s)
{
int i;
for(i=0;i<s;i++)
{
if(arr[i]==arr[s]||abs(i-s)==abs(arr[i]-arr[s])) return false;
}
return true;
}
void dfs(int k)
{
int i;
if(k>=n)
{
cnt++;
return;
}
for(i=0;i<n;i++)
{
arr[k]=i;
if(is(k)) dfs(k+1);
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
cnt=0;
dfs(0);
printf("%d\n",cnt);
}
return 0;
}

posted @ 2013-08-07 09:16  forevermemory  阅读(187)  评论(1编辑  收藏  举报