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

  • 相关阅读:
    io与网络
    画图联系
    Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常
    OracleHelper> Oracle数据库连接类及测试
    (转)如何将自己的Web项目部署在IIS中并运行(C# .NET ASP vs2019 详细教程 <原创内容>)
    如何进行Oracle安装TNS_ADMIN环境变量设置,所有数据库的tns_admin值都可以设置为单个位置,从而允许服务器上所有数据库使用一组SQL*Net文件
    @ConfigurationProperties注解原理与实战
    @ConfigurationProperties注解使用
    ODAC 安裝 (11.2.4)
    使用 IIS 部署web项目至 Windows 服务器到可以访问的详细操作
  • 原文地址:https://www.cnblogs.com/realize1536799/p/12729277.html
Copyright © 2020-2023  润新知