求解n皇后問題是演算法中回溯法應用的乙個經典案例,
回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。(參:
把棋盤儲存為乙個n維陣列a[n],陣列中第i個元素的值代表第i行的皇后位置,這樣便可以把問題的空間規模壓縮為一維o(n),在判斷是否衝突時也很簡單,首先每行只有乙個皇后,且在陣列中只佔據乙個元素的位置,行衝突就不存在了,其次是列衝突,判斷一下是否有a[i]與當前要放置皇后的列j相等即可。至於斜線衝突,通過觀察可以發現所有在斜線上衝突的皇后的位置都有規律即它們所在的行列互減的絕對值相等,即| row – i | = | col – a[i] | 。這樣某個位置是否可以放置皇后的問題已經解決。
下面是用遞迴的方式解決n皇后問題:
#include #include using namespace std;
const int n = 8;//皇后的個數
int a[n];//棋盤個數,n為皇后的行標,a[n]對應的值為皇后的列標
int number = 0;//一共有多少方案
void queen(int row);//遞迴放置皇后
void printqueen();//列印皇后方案
bool can_place(int row);//判斷是否放置皇后
void main()
void queen(int row)
else
} }}
void printqueen()
cout << "\n-------" << number << "------" << endl;
}bool can_place(int row)
} return 1;
}
下面是用非遞迴的方式解決n皇后問題:
#include using namespace std;
void queen();
bool canplace(int * a, int row);//能否放置皇后
void printqueen(int * a, int n);
const int n = 8;//n個皇后
int queens[n] = ;//列數初始化為-1
int sum = 0;//皇后放置方案總數
void main()
void queen()
{ int row = 0;
while (row>=0)
{ ++queens[row];//判斷該列是否可以放置皇后
//int m = 0;
while (queens[row]
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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...