題目描述
乙個如下的 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 ...