运行结果
代码如下
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运行时间略多一些,这不符合预期,按理来说,非递归实现运行时间应该更短。下一篇博客会再次对比非递归实现与递归实现。