1. 程式人生 > 其它 >C++-八皇后問題 解題思路

C++-八皇后問題 解題思路

【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
6<=N<=13) 表示棋盤是N x N的。

輸出

前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>
 2
using 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呢?!

 

 

 

 

 ??????