N皇后问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 35 Accepted Submission(s) : 28
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
#include<stdio.h>
#include<math.h>
int a[12],sum,n;
int can(int k)
{
for(int i=1;i<k;i++)
{
if(a[i]==a[k]||abs(a[i]-a[k])==abs(i-k))判断第K个皇后是否可以加入
return 0;
}
return 1;
}
void path(int k)k的初值为1
{
if(k>n)
sum++;安排完N个皇后后sum++
else
{
for(int i=1;i<=n;i++)
{
a[k]=i;//以k为横坐标,i表示其对应的列坐标
if(can(k)//此处并不是单单求出一组可能就跳出循环,它还有很多的i没有用过,要接着循环
path(k+1);//就算要跳出,也只是此语句在此i下结束
}
}
}
int main()
{
int b[12];
for(n=1;n<=10;n++)
{
sum=0;
path(1);
b[n]=sum; //记录下来
}
while(scanf("%d",&n),n)
printf("%d\n",b[n]);
return 0;
}