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;
}