N個皇后

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章