1. 程式人生 > 實用技巧 >洛谷 [USACO1.5]八皇后 Checker Challenge

洛谷 [USACO1.5]八皇后 Checker Challenge

題目描述

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

上面的佈局可以用序列246135來描述,第ii個數字表示在第ii行的相應位置有一個棋子,如下:

行號123456

列號246135

這只是棋子放置的一個解。請編一個程式找出所有棋子放置的解。
並把它們以上面的序列方法輸出,解按字典順序排列。
請輸出前33個解。最後一行是解的總個數。

輸入格式

一行一個正整數n,表示棋盤是n×n大小的。

輸出格式

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

輸入輸出樣例

輸入 #1
6
輸出 #1
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

說明/提示

【資料範圍】
對於100\%100%的資料,6n13。

dfs和回溯

b [ i ] 表示第 i 列的佔用情況。而行的佔用情況用迴圈控制,每行有且只有一個。

c [ ] 和 d [ ] 十分巧妙地表示了斜線的佔用情況。d的角標+n是防止出現 i - j < 0 的情況,整體平移n。