N皇后问题 回溯非递归算法 C++实现1

运行结果

代码如下

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAX = 1024;
 4 const char *LINE32 = "--------------------------------";
 5 const bool PRINT_DETAILS = false; 
 6 long long n, cnt = 0;// n表示皇后数量,cnt表示方案数量 
 7 int queen[MAX+1];
 8 
 9 void print() {
10     cout << LINE32 << endl;
11     cout << "" << cnt << "个方案: " << endl;
12     for (int i = 1; i <= n; i++) {
13         if (i != 1) {
14             cout << ", ";
15         }
16         cout << "(" << i << "," << queen[i] << ")";
17     } 
18     cout << endl;
19     for (int i = 1; i <= n; i++) {
20         for (int j = 1; j <= n; j++) {
21             if (queen[i] != j) {
22                 cout << 'x';
23             } else {
24                 cout << 'Q';
25             }
26         }
27         cout << endl;
28     }
29 }
30 
31 bool check(int row, int col) {// 检查是否可以在(row,col)这个坐标放置皇后 
32     for (int placed = 1; placed < row; placed++) {
33         if (queen[placed]==col || abs(row-placed)==abs(col-queen[placed])) {
34             return false;
35         }
36     }
37     return true;
38 }
39 void solve(int n) {
40     int row = 1;// row表示当前正在放置的行,初始值为1,表示从第一行开始放置皇后
41     queen[row] = 1;    // 即a[1]=1,表示初始时,先放一个皇后在(1,1)
42     while (row > 0) {// row的值最后为0,因为所有情况都检查完时,第一行往上回溯,row值就为0
43         if (row > n) {
44             // 找到一个解,之后需要向上回溯:从上一行的下一列开始检查 
45             cnt++;
46             if (PRINT_DETAILS) {
47                 print();
48             } 
49             queen[--row]++; 
50         } else if (queen[row] > n) {
51             // queen[row]表示的是当前row行上待检测的列的位置 
52             // 此时row行已经全部的位置都检查完了,同样的向上回溯:从上一行的下一列开始检查 
53             queen[--row]++; 
54         } else if (check(row, queen[row])) {
55             // 找到一个符合的位置,开始放置下一行,从第一列开始 
56             queen[++row] = 1; 
57         } else {
58             // 此时表示这个位置不符合,查看这一行下一列的位置
59             queen[row]++; 
60         } 
61     }
62 } 
63 
64 int main() {
65     // input
66     cout << "输入皇后个数: "; 
67     cin >> n;
68     // compute
69     clock_t begin = clock(); 
70     solve(n); 
71     clock_t end = clock(); 
72     // output
73     cout << LINE32 << endl;
74     cout << n << "皇后问题一共有" << cnt << "种解决方案" << endl; 
75     cout << LINE32 << endl;
76     cout << "回溯非递归算法实现1 解决" << n << "皇后问题耗时" << /*end-begin << "打点" <<*/(double)(end-begin)/CLOCKS_PER_SEC  << "s" << endl;
77     return 0;
78 } 
79 // 14 9~11s

与回溯递归算法实现1对比

回溯递归算法实现1运行情况

回溯非递归算法实现1运行情况

可以看到,非递归实现1比递归实现1运行时间略多一些,这不符合预期,按理来说,非递归实现运行时间应该更短。下一篇博客会再次对比非递归实现与递归实现

原文地址:https://www.cnblogs.com/realize1536799/p/12729277.html