八皇后问题动态演示_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