1. 程式人生 > 實用技巧 >2.n-皇后問題 DFS

2.n-皇后問題 DFS

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 //像全排列那樣搜
 4 //每一行都必須要放一個皇后也只能放一個皇后
 5 //先看第一行皇后可以放在哪一列
 6 const int N = 20;
 7 char ans[N][N];
 8 bool col[N], dg[N], udg[N];
 9 //同一列    正對角線   反對角線
10 int n;
11 void dfs(int u) {
12     if (u == n) {
13         for (int i = 0; i < n; i++) {
14 for (int j = 0; j < n; j++) { 15 cout << ans[i][j]; 16 } 17 cout << endl; 18 } 19 cout << endl; 20 return; 21 } 22 for (int i = 0; i < n; i++) { //列舉第u行,皇后應該放在哪一列 23 if (!col[i] && !dg[u + i] && !udg[u - i + n]) {
24 ans[u][i] = 'Q'; 25 col[i] = true; 26 dg[u + i] = true; 27 udg[u - i + n] = true; 28 dfs(u + 1); 29 ans[u][i] = '.'; 30 col[i] = false; 31 dg[u + i] = false; 32 udg[u - i + n] = false; 33 }
34 } 35 } 36 int main() { 37 cin >> n; 38 for (int i = 0; i < n; i++) { 39 for (int j = 0; j < n; j++) { 40 ans[i][j] = '.'; 41 } 42 } 43 dfs(0); 44 return 0; 45 }
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 //第二種搜尋順序
 4 //列舉每個格子放不放皇后
 5 //比第一種方法差一點
 6 const int N = 20;
 7 char g[N][N];
 8 bool row[N], col[N], dg[N], udg[N];
 9 //   行    列    正對角線   反對角線
10 int n;
11 void dfs(int x, int y, int s) { //x和y是座標,s是已經放下的皇后數量
12     if (y == n) {
13         y = 0;
14         x++;
15     }
16     if (x == n) {
17         if (s == n) {
18             for (int i = 0; i < n; i++) {
19                 for (int j = 0; j < n; j++) {
20                     cout << g[i][j];
21                 }
22                 cout << endl;
23             }
24             cout << endl;
25         }
26         return;
27     }
28     //這個格子不放皇后
29     dfs(x, y + 1, s);
30     //這個格子放皇后
31     if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n]) {
32         g[x][y] = 'Q';
33         row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
34         dfs(x, y + 1, s + 1);
35         //回溯
36         g[x][y] = '.';
37         row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
38     }
39 }
40 int main() {
41     cin >> n;
42     for (int i = 0; i < n; i++) {
43         for (int j = 0; j < n; j++) {
44             g[i][j] = '.';
45         }
46     }
47     dfs(0, 0, 0);
48     return 0;
49 }