首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。