zoukankan      html  css  js  c++  java
  • 八皇后问题动态演示_Qt5实现

      1 //核心代码如下
      2 //Queen--放置皇后
      3 
      4 #include "queue.h"
      5 
      6 queue::queue()
      7 {
      8     const int maxn = 9*9;
      9     this->QN = 4;
     10     this->board = new bool[maxn];
     11     for (int i = 0; i < maxn; i++) {
     12         this->board[i] = false;
     13     }
     14     this->judgeRecursion = true;
     15     this->count = 0;
     16 }
     17 
     18 queue::queue(int N)
     19 {
     20     const int maxn = 81;
     21     if (N > 9 || N < 4)
     22         this->QN = 4;    //如果不合法就正规化棋盘
     23     else
     24         this->QN = N;
     25     this->board = new bool[maxn];
     26     for (int i = 0; i < maxn; ++i)  //初始化棋盘,未放置棋子的棋盘设置为false
     27         this->board[i] = false;
     28     this->judgeRecursion = true;
     29     this->count = 0;
     30 }
     31 
     32 bool queue::available (const int Crow, const int Ccol) const  //当前行,当前列
     33 {
     34     for (int hor = 0; hor < Crow; ++hor) {
     35         //纵向查找
     36         if (board[hor * QN + Ccol])     //已经放置皇后的棋盘处为true
     37             return false;               //则返回false--放置不合法
     38     }
     39     int obli = Crow, oblj = Ccol;
     40     while (obli > 0 && oblj > 0) {
     41         if (board[(--obli) * QN + (--oblj)])
     42             return false;              //左斜上查找
     43     }
     44     obli = Crow, oblj = Ccol;
     45     while (obli > 0 && oblj < QN - 1) {
     46         if (board[(--obli) * QN + (++oblj)])
     47             return false;              //右斜上查找
     48     }
     49     return true;                       //都没有,则该位置可以放置皇后
     50 }
     51 
     52 //打印棋盘
     53 void queue::show (bool *Q)
     54 {
     55     const int maxn = 81;
     56     for (int i = 0; i < maxn; i++)
     57         Q[i] = this->board[i];
     58 }
     59 
     60 //重新初始化棋盘
     61 void queue::reset ()
     62 {
     63     const int maxn = 81;
     64     for (int i = 0; i < maxn; i++)
     65         this->board[i] = false;
     66     this->judgeRecursion = true;
     67     this->count = 0;
     68 }
     69 
     70 void queue::reset (int N)
     71 {
     72     const int maxn = 81;
     73     if (N < 4 || N > 9) this->QN = 4;
     74     else
     75         this->QN = N;
     76 
     77     for (int i = 0; i < maxn; i++)
     78         this->board[i] = false;
     79     this->judgeRecursion = true;
     80     this->count = 0;
     81 }
     82 
     83 queue::~queue ()
     84 {
     85     delete []board;
     86     board = nullptr;
     87 }
     88 
     89 /**
     90  * @brief queue::answer --- 放置皇后
     91  * @param solu --- 求解的方法数
     92  * @param Crow --- 当前的行数
     93  * @param Q --- 棋盘,用来打印
     94  */
     95 void queue::answer (int solu, int cur, bool *Q)
     96 {
     97     if (!judgeRecursion)   //递归结束,中断
     98         return;
     99     if (cur == QN) {                  //当前行到最后一行,则一种方案结束
    100         count++;
    101         if (count == solu) {          //递归到第solu方案时停止
    102             this->show (Q);
    103             judgeRecursion = false;   //停止递归
    104             return;
    105         }
    106         return;
    107     }
    108     else
    109     {
    110         for (int col = 0; col < QN; col++)
    111         {
    112             if (available (cur, col))         //检查当前行,列
    113             {
    114                 board[cur * QN + col] = true; //合法则放置皇后
    115                 answer (solu, cur + 1, Q);    //递归下一行
    116                 //如果回溯法中使用了辅助的全局变量,则一定要及时把它们恢复原状.
    117                 //特别的,若函数有多个出口,则需在每个出口处恢复被修改的值
    118                 board[cur * QN + col] = false;
    119             }
    120         }
    121     }
    122 }

    源代码下载地址:链接:https://pan.baidu.com/s/12BTDR8pRMvxpKYNFb988EQ 密码:yk0o

  • 相关阅读:
    DUDU,发回密码或者登陆系统一定有问题
    柱状图改进版
    辞职了......
    (转)密码学领域重大发现:山东大学王小云教授成功破解MD5
    用C# and GDI+画柱状图(可以从数据库里导出数据画)
    今天,在苏州落户了.
    在Windows2000Server(CPUP4)系统下安装Oracle时一点小问题
    毕业后,两个月,第二家公司上班第一天
    Ubuntu10.04窗口风格改为windows风格的方法
    MYSQL修改密码并设置允许远程访问
  • 原文地址:https://www.cnblogs.com/douzujun/p/5934043.html
Copyright © 2011-2022 走看看