1. 程式人生 > 其它 >遞迴求解八皇后問題

遞迴求解八皇后問題

技術標籤:資料結構遞迴

題目:
八皇后問題
在8*8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法

遞迴思路:在第1行安全位置放一個棋子,在第2行安全位置放一個棋子,以此類推,直到八行都放了棋子,第9行時退出遞迴過程。

C++程式碼:

//八皇后問題
//在8*8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法
//思路:在第1行安全位置放一個棋子,在第2行安全位置放一個棋子,以此類推,直到八行都放了棋子,第9行時退出遞迴過程
#include<iostream>
using namespace std; #define NUM 8 int Count = 0; //記錄擺法個數 int notDanger(int r, int l, int chess[NUM][NUM]) //判斷第r+1行、第l+1列的位置是不是安全位置 { int k = 0, i = 0, j = 0; int flag = 0; //判斷列方向 for (k = 0; k < NUM; k++) { if (chess[k][l] == 1) { flag = 1; break; } } //判斷左上方 for (i = r - 1, j = l - 1
; i >= 0 && j >= 0; i--, j--) { if (chess[i][j] == 1) { flag = 1; break; } } //判斷右下方 for (i = r + 1, j = l + 1; i < NUM && j < NUM; i++, j++) { if (chess[i][j] == 1) { flag = 1; break; } } //判斷左下方 for (i = r + 1, j = l - 1; i < NUM && j >=
0; i++, j--) { if (chess[i][j] == 1) { flag = 1; break; } } //判斷右上方 for (i = r - 1, j = l + 1; i >= 0 && j < NUM; i--, j++) { if (chess[i][j] == 1) { flag = 1; break; } } if (flag == 1) { return 0; } else return 1; } //引數row表示起始行,當前擺放的行編號 //引數line表示總列數 //引數chess[][]表示棋盤 void EightQueen(int row, int line, int chess[NUM][NUM]) { int i, j; //注意這裡要設定一個chess2,並用chess初始化,這樣某一行找不到安全位置,回退到上一行找下一個安全位置時,上一次在上一行擺放皇后的結果不會影響找該行下一個安全位置的過程 int chess2[NUM][NUM]; for (int i = 0; i < NUM; i++) { for (int j = 0; j < NUM; j++) { chess2[i][j] = chess[i][j]; } } if (row == NUM) //起始行是第9行時,擺放結束,打印出結果 { cout << "第" << Count + 1 << "個排列是:" << endl; for (i = 0; i < NUM; i++) { for (j = 0; j < NUM; j++) { cout << chess2[i][j] << " "; } cout << endl; } Count++; } else { for (j = 0; j < line; j++) { //判斷位置是否有危險,如果沒有危險繼續往下行放,有危險繼續在該行尋找安全位置 if (notDanger(row, j, chess2)) { for (i = 0; i < NUM; i++)//把該行所有位置置為0 { chess2[row][i] = 0; } chess2[row][j] = 1;//僅chess[row][j]位置=1 EightQueen(row + 1, line, chess2); } } } } int main() { int chess[NUM][NUM], i, j; //chess代表棋盤 for (i = 0; i < NUM; i++) //棋盤初始化為0,放皇后為1 { for (j = 0; j < NUM; j++) { chess[i][j] = 0; } } EightQueen(0, NUM, chess); system("pause"); return 0; }