C++-八皇后問題 解題思路
阿新 • • 發佈:2022-04-09
【Horn Studio】程式設計專欄: 拯救行動 解題思路
題目
題目描述
有一個NxN的棋盤,將N個棋子放置在棋盤上,使得每行、每列有且只有一個棋子,每條對角線(包括兩條主對角線的所有平行線)上至多有一個棋子。 假設N的取值為6,其中一個有效的佈局如下。上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行相應的列有一個棋子,如下:
行號 1 2 3 4 5 6
列號 2 4 6 1 3 5
請編寫程式找出所有滿足條件的佈局。並將它們以上面的方式輸出。輸出的序列按字典序排列。
只輸出前3個滿足條件的佈局。最後一行為滿足條件的佈局總數。
輸入
一個整數N (6<=N<=13輸出
前3行為前3個解,每個解的兩個數字之間用一個空格隔開。第4行為一個整數,表示解的總數。樣例輸入 複製
6
樣例輸出 複製
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
提示
思路
同樣我們又雙叒叕來觀察樣例是什麼:
有點亂,但是可以看出這幾個點所發出的線均沒有涉及到其他點,所以說,這是一種正確答案啊!(敲黑板)
所以呢……暴力解決也是一種可行的方案,因為數值不大,且寫起來簡單,因此在這裡採用這種辦法。
*很標準的dfs!
程式碼
1 #include <bits/stdc++.h> 2using namespace std; 3 int n; 4 int a[20]; 5 int cnt = 0; 6 int can[20], dgl[100], dgr[100]; 7 8 void dfs(int x) 9 { 10 if (x == n) { 11 cnt++; 12 if (cnt < 4) { 13 for (int i = 1; i <= n; ++i) { 14 cout << a[i] << " "; 15 }16 cout << endl; 17 } 18 return; 19 } 20 for (int i = 1; i <= n; i++) { 21 if (can[i] || dgl[x + 1 - i + n] || dgr[i + x + 1]) { 22 continue; 23 } 24 a[x + 1] = i; 25 can[i] = 1; 26 dgl[x + 1 - i + n] = 1; 27 dgr[i + x + 1] = 1; 28 dfs(x + 1); 29 can[i] = 0; 30 dgl[x + 1 - i + n] = 0; 31 dgr[i + x + 1] = 0; 32 } 33 } 34 35 int main() 36 { 37 cin >> n; 38 dfs(0); 39 cout << cnt << endl; 40 return 0; 41 }
彩蛋
我就說嘛,我寫的程式怎麼可能WA、TLE\RE呢?!
??????