N皇后演示程序
问题描述:
在N×N格的棋盘上放置彼此不受攻击的N个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子,求解可以放置的布局方式。
设计要求:
(1) 要求实现图形化棋盘显示;
(2) 要求实现N皇后布局演示,可以使用方向键进行布局切换。
问题分析:
当n的个数比较小时,我们可以采用穷举法来列举可能出现的情况,但当n的个数比较大时,就需要考虑其他的方法了。在n*n的棋盘上,每个皇后可能有n个摆放位置,有两种方法可以来进行判断:
1.最后一个皇后已经放到棋盘,此时在进行判断是否满足条件。
2.每放一个皇后就进行判断,当不满足条件时,后面的情况就不用再考虑了,直接看下一个摆放的位置。
如下图:

因此我们就可以得到解题思路,每放一个皇后就与上一个进行判断,判断该位置是否与前面的皇后发生冲突。
算法实现:
#include<cmath>
using namespace std;
int n,tol=0; // N皇后个数和成功个数
int queen[100] = {0}; //[]里的值代表行数,value值代表列数
int col[1000][100] = {0}; //用来存放成功的数据
bool check(int r,int c){ // (r,c)代表新皇后的坐标
for(int i=0;i<r;i++){
if(queen[i]==c||(abs(queen[i]-c) == abs(r-i))){ // 判断是否冲突(第一个判断的是行数等于列数,即对角线)
return false;
}
}
return true;
}
void DFS(int r){
if(r==n){ //判断最后一个是否已经放到棋盘,最后一个放到棋盘,说明是一种解法
for(int i=0;i<n;i++){
col[tol][i] = queen[i]; //讲棋盘存到总的期盼里
}
tol++; //成功次数++
//queen[100]={}; //初始临时棋盘
return;
} for(int c=0;c<n;c++){
if(check(r,c)){ //判断该位置是否与前n-1个位置冲突
queen[r] = c; //不冲突赋值
DFS(r+1); //进行一下行操作
}
}
}
void show(int r){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(col[r][i]==j){//col[r][i]有保存的值,和j做比较
cout<<"Q ";
}else{
cout<<"X ";
}
}
cout<<endl<<endl;
}
cout<<"************当前页数"<<r+1<<"************"<<endl<<endl;
cout<<"*********->查看下一个,<-查看上一个*********"<<endl;
}
int main(){
cout<<"请输入皇后的数量:";
cin>>n;
if(n<3){
cout<<"无解!"<<endl;
return 0;
}
DFS(0);
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
int ch1=0;
int ch2=0;
int current = 0;
show(current);
//实现左右翻页
while (1){ //无限循环
//使用getch()读取方向键,读取方向键需要读取两次
if (ch1=getch()){
ch2=getch();//第一次调用getch(),返回值224
switch (ch2){//第二次调用getch()
case 75: { //←的ascll
if(current-1>=0){
current--;
}else{
current = tol-1;
}
system("cls\n");
cout<<"请输入皇后的数量:"<<n<<endl;
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
show(current);
break;
}
case 77: {
if(current+1<=tol-1){
current++;
}else{
current = 0;
}
system("cls\n");
cout<<"请输入皇后的数量:"<<n<<endl;
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
show(current); break;
}
default:cout<<"输入错误!"<<endl;break; }
}
}
return 0;
}
代码说明:
采用数组来存放结果,方向键的切换是采用读取getch来实现的。在函数check()中,判断冲突的条件是通过循环遍历来检验刚刚放进的第r行皇后是否与前r-1行放的发生冲突,即行数相等或列数相等。
资料参考:
n皇后详解及代码实现/C++ - Geek_Ling - 博客园 (cnblogs.com)
https://www.cnblogs.com/yangxiao-/p/13683675.html
N皇后演示程序的更多相关文章
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [LeetCode] N-Queens N皇后问题
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- LeetCode:N-Queens I II(n皇后问题)
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
随机推荐
- 操作系统思考 第十一章 C语言中的信号量
第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...
- Python--数据存储
新建测试文档测试.txt内容如下: 张三:今天天气真好. 李四:是的,真的太好了. 张三:阳光明媚. 李四:鸟语花香. 王五:装逼现场:请带好安全帽 张三:难得好天气,今天就不偷懒了. 李四:能把乞讨 ...
- 为什么有些容器在docker run的时候需要接 -it ,有些不需要?
这是我们的Dockerfile文件 FROM busybox ENV sg WANG CMD ["/bin/sh", "-c", "echo wang ...
- 从net到java:MyBatis快速入门
第一:这不是net与java的对比,只是我学习java相关知识梳理的笔记. 第二:这也没有否认net,只是现在的工作需要自己会java. 第三:这不深入.只是我看了些官网和网上的视频,算是入门的总结. ...
- SpringBoot-400-Bad-Request(Request-header-is-too-large)
错误 Request header is too large 分析 请求头内容过大 解决方案 1.SpringBoot版本1.3.8.RELEASE在配置文件中添加: 如果springboot内置to ...
- 【版本管理工具】git的介绍及常用命令总结
1 git简介 1.1 git是什么? "Git 是一个分布式版本控制软件,与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可 ...
- RibbitMQ 实战教程
# RabbitMQ 实战教程 ## 1.MQ引言 ### 1.1 什么是MQ `MQ`(Message Quene) : 翻译为 `消息队列`,通过典型的 `生产者`和`消费者`模型,生产者不断向消 ...
- docker实现mysql主从复制
目录 一.概述 二.创建master主库 三.创建Slave实例 四.主从配置 五.参考 一.概述 1.原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时 ...
- 有关spring注解总结
前言 目前企业开发多采用纯注解的方式开发,注解开发的好处:简洁,可读性强 最近学习了spring全家桶,总结了有关spring的常用注解,写的不对的地方,欢迎指正 Spring模块注解 @Config ...
- IoT边缘,你究竟是何方神圣?
摘要:IoT边缘扮演着纽带的作用,连接边缘和云,将边缘端的实时数据处理,云端的强大计算能力两者结合,创造无限的价值. 本文分享自华为云社区<IoT边缘如何实现海量IoT数据就地处理>,作者 ...