洛谷1219N皇后

2021-10-10 23:47:07 字數 1520 閱讀 7421

題目描述

乙個如下的 6×66 \times 66×6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有乙個,每條對角線(包括兩條主對角線的所有平行線)上至多有乙個棋子。

上面的布局可以用序列 2 4 6 1 3 52\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 來描述,第 iii 個數字表示在第 iii 行的相應位置有乙個棋子,如下:

行號 1 2 3 4 5 61\ 2\ 3\ 4\ 5\ 61 2 3 4 5 6

列號 2 4 6 1 3 52\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5

這只是棋子放置的乙個解。請編乙個程式找出所有棋子放置的解。

並把它們以上面的序列方法輸出,解按字典順序排列。

請輸出前 333 個解。最後一行是解的總個數。

輸入格式

一行乙個正整數 nnn,表示棋盤是 n×nn \times nn×n 大小的。

輸出格式

前三行為前三個解,每個解的兩個數字之間用乙個空格隔開。第四行只有乙個數字,表示解的總數。

輸入輸出樣例

輸入 #1

輸出 #1

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4說明/提示

【資料範圍】

對於 100%100%100% 的資料,6≤n≤136 \le n \le 136≤n≤13。

筆者剛剛接觸到dfs演算法和回溯遞迴,關於dfs的思想僅有一點理解,處於大一的本人感覺與其說這道題是用dfs演算法解答,倒不如說是回溯遞迴完美地實現了dfs演算法.

對於n皇后問題,按行選擇乙個位置放置,對於任何乙個被放置的點,假設其座標為(x,y),其中x為行y為列,自左上到右下與其處於同一斜線的點其座標之差為定值且等於x-y,自左下到右上與其處於同一斜線的點其座標之和為定值且等於x+y。基於這一點分別建立三個陣列(同列的y座標相同)即可對放置皇后的座標的兩條斜對角線和同列直線進行標記(因為是逐行放置乙個皇后不存在同行的情況),為了防止出現負數(陣列的下標只能為正或0),用x-y+n(n為皇后數)來代替x-y即可。

#include

#include

using

namespace std;

int n, a[3]

[100]=

, sum =

0, lay[

100]

;//n為皇后數,sum儲存解的個數,lay為放置皇后的點(輸出)

//用行數為3的二維陣列即可儲存乙個點的所處的三條直線的**座標特徵**,當然用3個一維陣列也可

void dfs (

int l)

for(

int i =

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

}int

main()

關於回溯遞迴的關鍵,在於遞迴的退出條件和遞迴前遞迴後的語句.

位運算n皇后 洛谷1219

老鐵已經很久沒有更博了。自從考完noip後老鐵一蹶不振,從此走上心理陰影無限大,吾將上下而求索的道路。又去石家莊聽課 並不能聽懂 於是自己學一學一些奇怪的演算法。題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行...

洛谷1219 八皇后

www.luogu.org 原網頁 題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號...

洛谷 P1219 八皇后

題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...