題目描述
乙個如下的 6×6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有乙個,每條對角線(包括兩條主對角線的所有平行線)上至多有乙個棋子。
上面的布局可以用序列 2 4 6 1 3 5 來描述,第 i 個數字表示在第 i 行的相應位置有乙個棋子,如下:
行號 1 2 3 4 5 6
列號 4 6 1 3 5
這只是棋子放置的乙個解。請編乙個程式找出所有棋子放置的解。並把它們以上面的序列方法輸出,解按字典順序排列。
請輸出前 3 個解。最後一行是解的總個數。
輸入格式
一行乙個正整數 n,表示棋盤是 n×n 大小的。
輸出格式
前三行為前三個解,每個解的兩個數字之間用乙個空格隔開。第四行只有乙個數字,表示解的總數。
輸入輸出樣例輸入
6
輸出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
說明/提示【資料範圍】 對於 100% 的資料,6 ≤ n ≤ 13。
本題思路:
皇后所在的那一行不能放皇后的規則可以通過一行一行的放皇后來避免
皇后所在的那一列不能放皇后的規則可以使用乙個陣列來記錄,如a[2] = -1
代表第二列放了皇后
對角線不能放皇后的規則可以通過斜率等於1/-1
來解決即|x1 - x0| == |y1 - y0|
使用暴力的方式一行一行試著放皇后,實在放不下(不符合規則)的時候就回溯到上一行(即上一行皇后的位置重新擺放)
當然同一列不能放兩個皇后的規則也可以通過判斷縱座標相等不相等來實現,但是這樣做會超時,所以我們需要空間來換時間。用乙個陣列來記錄皇后所在列,在通過陣列判斷來達到o(1)的複雜度。
ac**:
#include
#include
using namespace std;
int n, a[14]
, num =0;
// k限制輸出次數 iscol記錄皇后所在的列
int k =
3, iscol[14]
;bool ok
(int j)
return true;
}void
queen
(int j)
cout << endl;
}return;}
for(a[j]=1
; a[j]
<= n; a[j]++)
}}intmain()
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...
洛谷p1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...