N皇后問題

2021-08-17 16:38:07 字數 1938 閱讀 5174

問題描述:八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。

我們可以通過下面的圖示來展示回溯法的過程,從而更加有助於我們的理解 :

我們在試探的過程中,皇后的放置需要檢查他的位置是否和已經放置好的皇后發生衝突,為此需要以及檢查函式來檢查當前要放置皇后的位置,是不是和其他已經放置的皇后發生衝突

假設有兩個皇后被放置在(i,j)和(k,l)的位置上,明顯,當且僅當|i-k|=|j-l| 時,兩個皇后才在同一條對角線上。

(1)先從首位開始檢查,如果不能放置,接著檢查該行第二個位置,依次檢查下去,直到在該行找到乙個可以放置乙個皇后的地方,然後儲存當前狀態,轉到下一行重複上述方法的檢索。

(2)如果檢查了該行所有的位置均不能放置乙個皇后,說明上一行皇后放置的位置無法讓所有的皇后找到自己合適的位置,因此就要回溯到上一行,重新檢查該皇后位置後面的位置。

解法一:

#include 

#include

#define max 4

//sum用於描述解的可能的個數,每當輸出一次復合要求的位置

//sum的數量就會被+1

int queen[max], sum=0; /* max為棋盤最大座標 */

void show() /* 輸出所有皇后的座標 */

printf(")\n");

//每次輸出一種解的時候,那麼他的解的數量就會增加1

sum++;

}//此函式用於判斷皇后當前皇后是否可以放在此位置

int place(int n) /* 檢查當前列能否放置皇后 */

}return1;}

//核心函式,回溯法的思想

void nqueens(int n) /* 回溯嘗試皇后位置,n為橫座標 */

else}}

}int main()

解法二:

#include 

#include

#include

#include

#define initial -10000 //棋盤的初始值

void init(int a,int n) //對棋盤進行初始化

}int valid(int a,int row, int col,int n) //判斷第row行第col列是否可以放置皇后

return1;}

void print(int a,int n) //列印輸出n皇后的一組解

printf("\n");

}printf("\n");

for (i = 0; i < n; ++i)

printf("%d ", a[i]+1);

printf("\n");

printf("--------------------------------\n");

}void queen(int a,int n) //n皇后程式

else

}if(a[i] == initial) //第i行沒有找到可以放置皇后的位置

}if (i == n - 1) //最後一行找到了乙個皇后位置,說明找到乙個結果,列印出來

++i; //繼續探測下一行的皇后位置

}}int main()

效果截圖:

N皇后問題

include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...

N皇后問題

採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...

N皇后問題

問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...