n皇后問題 深搜回溯dfs

2021-09-26 16:26:15 字數 1434 閱讀 9326

問題介紹:

n皇后問題是乙個以西洋棋為背景的問題:如何能夠在n×n的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上

eg:在n×n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n×n格的棋盤上放置n個皇后,任何兩個皇后不放在同一行或同一列或同一斜線上。

設計乙個解n皇后問題的佇列式分支限界法,計算在n×n個方格上放置彼此不受攻擊的n個皇后的乙個放置方案。

注意,本問題的答案可能是不唯一的。如,當n=5時,至少有3個答案:

input

輸入一行,乙個正整數n。 4 < n < 13

output

輸出彼此不受攻擊的n個皇后的乙個放置方案。

sample input

5
sample output

1 3 5 2 4
佇列式分支限界法?可能是廣搜吧 我現在用深搜做:

1.任何兩個皇后不放在同一行或同一列或同一斜線上。

1)那麼也就是說每行最多放乙個,每列也是最多放乙個。如此我們可以列舉每行或者每列去爆搜,(如果檢查了該行所有的位置均不能放置乙個皇后,說明上一行皇后放置的位置無法讓所有的皇后找到自己合適的位置,因此就要回溯到上一行,重新檢查該皇后位置後面的位置。這就是回溯)這裡我們選擇枚舉行,同時用乙個一維陣列row記錄每行的皇后所在的位置,如:row[j]=i表示第j行的皇后放在第i列,(用一維陣列比二維陣列省空間)。

2)怎麼保證不在同一斜線呢?因為任意兩個點如果在同一對角線,他們的斜率是為+1或者-1的,斜率k=(行a-行b)/(列a-列b)=±1,我們可以巧用絕對值abs()函式

abs(行a-行b)!=abs(列a-列b)

2.解出任意乙個解就行,並輸出每一列的皇后位置。

即輸出row陣列就行了,時間複雜度遠小於nn。

ac**:

#include

using namespace std;

int n;

int row[15]

;int k=0;

void

dfs(

int x)

int flag=1;

if(k==1)

return

;//因為找到乙個解就好了

for(

int i=

1;i<=n;i++)if

(flag)}if

(flag)

flag=1;

//別忘了

}return;}

intmain

(void

)

2n皇后問題(深搜dfs)

基礎練習 2n皇后問題 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后 和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩 個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙...

深搜 N皇后問題

n皇后問題 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在...

HDU 2553 N皇后問題(深搜 回溯)

回溯法,一直錯在了標記為1,0上面,應該標記為 這樣回溯的時候才不會把別人的點還原 同時,這一題要記錄下來這10個的answer,否則tle include include includeusing namespace std int t,k,n char map 105 105 void dfs ...