QUST 2020級第三學期算法數據結構測試 Contest1121
T4
原題來自 USACO1.5
Checker Challenge, 洛谷 P1219
Problem Description
一個如下的 6 x 6
的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有一個,每條對角線(包括兩條主對角線的所有平行線)上至多有一個棋子。
0 1 2 3 4 5 6
-------------------------
1 | | O | | | | |
-------------------------
2 | | | | O | | |
-------------------------
3 | | | | | | O |
-------------------------
4 | O | | | | | |
-------------------------
5 | | | O | | | |
-------------------------
6 | | | | | O | |
-------------------------
上面的佈局可以用序列 2 4 6 1 3 5
來描述,第 k
個數字表示在第 k
行的相應位置有一個棋子,如下:
行號 1 2 3 4 5 6
列號 2 4 6 1 3 5
這只是棋子放置的一個解。請編一個程序找出所有棋子放置的解。
並把它們以上面的序列方法輸出,解按字典順序排列。
請輸出前 3
個解。最後一行是解的總個數。
Inputs
一行一個正整數 m
,表示棋盤是 m x m
大小的。
Outputs
前三行為前三個解,每個解的兩個數字之間用一個空格隔開。
第四行只有一個數字,表示解的總數。
Samples
Sample #1
Inputs
1
6
Outputs
1
2
3
42 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
Details
- 數據范圍:對於
100%
的數據,6 <= n <= 13
。 - 題目翻譯來自NOCOW。
- USACO Training Section 1.5
Analysis
Solution Program
1 |
|
Alternative Solution by ybb756032937
1 |
|
- 注:對角線
d[i-j]
後面必須加上一個n
,因為i-j
可能為負數,那麼數組就會出錯,所以將整體向右偏移n
個單位(坐標偏移不會影響我們需要達到的目的),將所有可能變成正數;(因為i-j
的最小值是-n+1
,所以加上一個n
就一定會變成一個正數)- 本道題最重要的就是記錄下皇后佔領的格子(打標記的思想),通過此判斷下一個皇后是否可以在某個位置,如果可以,則繼續搜索下一個皇后可以在的位置,如果不行,則清除標記回到上一步,繼續搜索;
- 可以先考慮六個皇后(即6*6網格),再將6改為n,並且輸入n,就可以得出6到13個皇后的解了;