N後問題 回溯法求解

2021-07-25 15:02:26 字數 1149 閱讀 3699

題目:在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

對於給定的n,求出有多少種合法的放置方法。

演算法分析與設計:

深度優先搜尋dfs,遍歷圖中所有的節點,列舉所有方案。篩選出符合條件的方案。

先看一下約束條件:不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

約束條件轉化:

同一行,同一列:由題可知,n個皇后只能每行放乙個,因此採用n元組x[1:n]表示n後問題的解,其中x[i]表示皇后i放在第i行的第x[i]列。由於不允許將兩個皇后放在同一列上,所以x[i]互不相同。

處在與棋盤邊框成45角的斜線上:假設存在a(i,x[i]),b(k , x[k])我們可知ab兩點在同意對角線即斜率為正負一的情況下應滿足

i-k=x[i]-x[k]或 i-k=x[k]-x[i]; 由此可得| i-k | = | x[i]-x[k] |

程式**:

/**

*@author dabaitudingya

*@version 1.0 2016-12-25

*@description 回溯法解n皇后問題

*@environment code::blocks 13.12

*/#include

#include

#include

#include

using

namespace

std;

#define n 12+2

int x[n],n; /*定義x[n]一維儲存結構,x[i]=j,表示第i行的值為第j列

這樣就避免了皇后存在同一行的問題,而且壓縮了儲存空間*/

int sum[n]; //儲存每次計算出來的值,防止重複計算導致超時

int num;

bool check(int row) //判斷第x[row]列是否可以放置皇后

void backtrack(int row)

}}int main()

while(cin>>n && n)

cout

0;}

n後問題 回溯法

一.問題描述 在n n格仔上放置n個皇后,按照西洋棋規矩不可讓皇后相互攻擊,即如何兩個皇后不放在同一列同一行同一斜線上.二.演算法設計 將問題轉化為逐行放置皇后,即第一次放第1行,第二次放第2行,依次類推放至第n行皇后則放置完畢,如此每次放置只需考慮皇后的列衝突和斜線衝突.因為每次皇后都在新的一行放...

回溯法 n後問題

n後問題 1.問題描述 在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。2.演算法設計 用n元組x 1 n 表示n後問題的解。其中,x i 表示皇...

n後問題 回溯法

問題描述 在n n的棋盤上放置彼此不受攻擊的n個皇后。按西洋棋的規則,皇后可以與之處在同一行或者同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n皇后,任何2個皇后不放在同一行或同一列的斜線上。演算法設計 i k j l 成立,就說明2個皇后在同一條斜線上。可以設計乙個place函式,...