N皇后問題(N queen s problem)

2021-06-28 23:57:35 字數 2515 閱讀 1577

n 皇后問題是乙個古老而著名的問題, 是回溯演算法(back track)的典型案例。問題描述如下:

n x n 的棋盤上放置n個皇后。 要求同一行中, 同一列中, 以及對角線上(包括正負對角線)只能有乙個皇后, 否則就會發生clash的情況而失敗。 問解決方案?

解決思路如下:

(1)逐列掃瞄, 從最左邊的列開始, 總共有n個queens。

(2)如果所有的queens 都被安全放置了, 就返回true。

(3)對於給定的列, 嘗試所有的行, 此時行是變數, 注意此時此列的左邊的所有的列都放置了皇后, 此時我們只需要對當前列的所有行進行掃瞄, 尋找放置的可行的行,所謂可行就是不會與左邊的皇后產生clash, 條件為三個方向, 不同列(當然會滿足), 不同行, 不同上斜對角線, 不同下斜對角線。 

(4) 一旦放置好當前的列乙個的皇后, 就進入下一列放置。 但是一旦沒有產生可行解的時候, 就要回溯(backtrack)到上一列, 重新放置上一列的皇后, 繼續重複上述步驟, 直至成功, 否則輸出失敗。

#include #include using namespace std;

const int n = 4;

// a utility function

void printsolution(int board[n][n])

cout << endl;

}}// a utility function to chreck if a queen can

// be placed on board[row][col], note this function

// is called when 'col' queens already placed in columns

// from 0 to col - 1, so we need to check only left side

// for attacking queens

bool issafe(int board[n][n], int row, int col)

}// check upper diagonal on left side

for(int i = row, j = col; i >= 0 && j >= 0; --i, --j)

}// check lower diagonal on left side

for(int i = row, j = col; i < n && j < col; ++i, --j)

}return true;

}// a recursive utility function to solve n queen

// problem

bool solvenqutil(int board[n][n], int col)

// consider this column and try placing this queen in all rows

// one by one

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

// if placing queen on board[i][col] does

// not leads to a solution, we should remove it

board[i][col] = 0; // backtrack}}

// if queen cannot be placed in any row

// in this column col, then return false

return false;

}bool solvenq() , ,

, };

if(solvenqutil(board, 0) == false)

else

}// driver program

int main()

執行結果如下:

參考wiki的 如下**產生所有nqueen的所有的可行解:

#include using namespace std;

const int n = 4;

int position[n]; // 記錄解決方案的n個queen的位置

// check if a position is safe

bool issafe(int queen_number, int row_position)

return true;

}// recursively generate a tuple like [0 0 0 0], then [0 0 0 1] then etc...

void solve(int k)

else

} }}

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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...