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

时间: 2024-10-25 16:56:02

Qt_界面程序实现_N皇后问题_Q_Queen的相关文章

DuiVision开发教程(2)-如何写一个简单的界面程序

基于DuiVision界面库开发的界面程序主要包括如下几部分内容: 1.资源定义,包括图片资源.各个窗口界面的xml定义文件 2.事件处理类代码,用于处理界面响应消息 3.其他业务逻辑代码 下面举例说明如何写一个简单的界面程序. 第一步:使用VC向导创建一个有两个tab页面的DuiVision工程 向导生成的解决方案文件如下: 默认有两个工程,分别是DuiVision库和应用程序工程.自动生成的代码目录中bin目录下的内容那个如下,bkimg目录存放窗口背景图片,skins目录存放图片资源,xm

[Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]

场景: 1. 开发Windows界面程序时,需要打印输出,断点在调试多线程程序有局限性,就是会干扰线程的优先顺序,看不到正确的结果,往往就是断点就没事, 没断点程序就不能正常运行了. 2. 使用动态库(静态库)时,出现问题时在Dll里写std::cout输出信息是必不可少的调试方法,特别对于多线程程序,谁先谁后暂停后的结果就会不一样了. 有时候没有动态库的代码时,也没法对动态库打断点. 3.  打开控制台窗口后只能看到WIndows程序的输出而无法看到Dll的输出? 4. 直接改配置属性->链接

Ubuntu下用glade和GTK+开发C语言界面程序(一)

前言:对于大学中计算机系的每年暑假的课设有太多想说的,能从中学到很多东西,当然不排除打酱油的,这些可以掠过哦,凡事都打酱油,人生也是打酱油的吧.2333. 对于大三以前的课设一般的要求都是用C写的,即使你学的面向对象很好,也只能老老实实的来用C写.当然这其中还有好多要说道的东西. 用C写,面对windows下的那不能再吐槽的cmd终端,我就不说太多了,因为已经很少到windows上做东西.用C写,又想写的高大上一点,当然要有图形界面了,在linux上用C写界面程序,GTK+是少不了的,但是运用面

linux启动后自动登录并运行自定义图形界面程序

在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使用fb或者directfb图形模式: 2.启动xserver不启动桌面系统. 第一种方法性能并不一定高,因为支持fb的显卡驱动可能找不到,就是用上显卡驱动了也需要CPU大量参与.另外如果用这种方式可供选择的图形程序开发技术就受限了.所以这种方法通常用在嵌入式环境下. 第二种方法只要显卡驱动了,CPU就能得到解

Quartz(GUI)图形界面程序----Quartz Web

下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用户群体是必需的.几年前,一个 Web 应用被创立,它可用于管理 Quartz 框架.虽说是历经了几年有相当投入的开发,但不得不说的,总是时断时续的.近来出现有更多的要求对这个应用的更新与支持,因而又重新吸引了新的开发者自愿的工作并使之保持不断更新.这个应用就是知名的 Quartz Web 程序.Qu

创建第一个界面程序

通过swing创建一个简单的图形界面程序,帮助读者快熟了java桌面程序开发步骤,掌握简单的图形界面开发程序,轻松开发复杂的图形界面程序.在swing中,代表窗体的是javax.swing.JFrame,陈故乡中的其他组件必须包含在JFrame窗体上才能被显示在屏幕上,因此也称为JFrame的容器类,它能像一个容器一样容纳别的组件.要使用JFrame类创建窗体,首先要做的就是在程序中导入javax.swing.JFrame类,另外,在本事例中还要用到一个标签(也是一个Swing组件),在Swin

在ubuntu上使用wxWidgets成功开发一个图形界面程序

编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+,当前版本依赖高于2.8.2的版本.我安装了3.0版本的GTK+.apt-get install gtk+-3.0-dev.一般开发用的库,都有个-dev结尾,这是个约定.开发用的库包含了头文件和文档之类的东西. 为了让不同平台wxWidgets编译之后放到各自的文件夹下,先在解压得到的文件夹下创建一

python 初学03 Eric+PyQt+python IDE与界面程序

近期一直在学习python和批处理,来将工作中的手工操作的低效环节用脚本自动实现. 已经实现了几个脚本.但是命令行窗口,总是不太友好,对执行结果的反馈也不清楚,就想实现可视化. 在网上找到Python可视化的编程的一个方法,周末专心实现了一下,效果还行,算是有头绪了. http://blog.sina.com.cn/s/blog_514104fc0101c8yi.html 主要是按照上面这篇博客的方法实现的.感谢作者. 一.环境与软件版本 Eric特别挑软件版本,与PyQt 和 python的版

Java swing五子棋源码及实现之Java 开发图形界面程序五子棋的实现方式

今天给大家介绍一下如何用Java swing实现五子棋的开发即用Java开发图形界面程序五子棋,代码由于太多,只贴部分,最下面会附上下载地址,废话不多说,下面我们先看一下运行结果: 接下来我们看代码: 首先是创建主frame框架界面: package org.liky.game.frame; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import