首页 > 代码库 > Qt_界面程序实现_N皇后问题_Q_Queen

Qt_界面程序实现_N皇后问题_Q_Queen

技术分享技术分享

  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     else109     {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/1slOrCJV 密码: 6xtn

Qt_界面程序实现_N皇后问题_Q_Queen