問題描述:八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...