为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。一共92个解
解决思路:一层层回溯,采用深度优先的递归算法。
动态分配的数组不方便调试,看不到数据,用Position[]这种数组好调试,clsArr为了能使用vector封装了下数组,实现了索引重载。
Position 是从 (1,1)开始,代表第一行第一列。
 
算法源码:头文件

#pragma once
#include"Position.h"
#include<vector>
#include<array>
using std::array;
using std::vector; class QueenGame
{
private:
const int SIZE = 9;
int getCount;
int count;
Position* posArr;
clsArr pA;
vector<clsArr>vecResult;
bool PosIsOK(int x, int y);
public:
QueenGame(int n = 8) {
count = n;
getCount = 0;
posArr = new Position[count];
}
~QueenGame() {
delete[]posArr;
}
QueenGame(const QueenGame& q) {
this->count = q.count;
this->getCount = q.getCount;
this->posArr = new Position[q.count];
for (size_t i = 0; i < q.count; i++)
{
this->posArr[i] = q.posArr[i];
}
}
const vector<clsArr> GetResult()const {
return vecResult;
}
void Play(int x, int y);
};
定义:
#include "QueenGame.h"
#include"Position.h"
#include<math.h>
bool QueenGame::PosIsOK(int x, int y) { for (size_t i = 0; i < count; i++)
{
Position pos = pA[i]; if (pos.x <= 0 && pos.y <= 0) {
continue;
}
if (x == pos.x || y == pos.y) {
return false;
}
else {
if (std::abs((x - pos.x) * 1.0 / (y - pos.y)) == 1) {
return false;
}
}
}
return true;
}
void QueenGame::Play(int x, int y) {
if (x >= SIZE && y >= SIZE) {
return;
}
for (; y < SIZE; y++)
{
if (PosIsOK(x, y)) {
Position pos(x, y); *(posArr + (getCount)) = pos;
pA[getCount] = pos;
++getCount;
if (x < SIZE - 1) {
Play(x + 1, 1);
}
else {
int sss = 0;
if (getCount == count) {
vecResult.push_back(pA);
pA[--getCount].set(-1, -1); continue;
} }
}
}
if (getCount >= 0)
{
--getCount;
posArr[getCount].set(-1, -1);
pA[getCount].set(-1, -1);
}
return;
}

运行:

QueenGame qGame(8);
qGame.Play(1,1);
auto result= qGame.GetResult();

辅助类:

struct Position
{
int x;
int y; Position(int a, int b) {
x = a;
y = b;
}
Position() {
x = -1;
y = -1;
}
void set(int a, int b) {
x = a;
y = b;
}
};
class clsArr {
public:
Position pos[8];
Position& operator[](int i) {
return pos[i];
}
};

【c++】求解八皇后问题的更多相关文章

  1. 用dfs求解八皇后问题

    相信大家都已经很熟悉八皇后问题了,就是指:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.主要思路:按行进行深度优先搜索,在该 ...

  2. java递归求八皇后问题解法

    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...

  3. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  4. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  5. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  6. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  7. OpenJudge1700:八皇后问题 //不属于基本法的基本玩意

    1700:八皇后问题//搜索 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...

  8. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  9. VC版八皇后

    一.  功能需求: 1. 可以让玩家摆棋,并让电脑推断是否正确 2. 能让电脑给予帮助(给出全部可能结果) 3. 实现悔棋功能 4. 实现重置功能 5. 加入点按键音效果更佳 二.  整体设计计: 1 ...

  10. 八皇后问题(C#)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

随机推荐

  1. MySql-BlackHole:黑洞引擎

    通过查看SHOW ENGINES;或SHOW VARIABLES LIKE 'have%';的输出来查看但前的mysql版本是否支持这个引擎. 1 mysql> show engines; 2 ...

  2. 一文告诉你商业智能BI如何推动推动智慧物流发展

    随着网络消费的不断发展,推动了物流等相关产业的迅速发展,另外无论是2B业务还是2C业务的生产制造企业,对物流的要求都越来越高,尤其体现在对物流全程透明可视化的需求.商业智能BI平台的引入,大大提高了物 ...

  3. 动态库 DLL 封装二:dll封装方法

    例:我新建的工程是,带lib的MFC规则的DLL 主要有三个文件需要写东西 ( .h /  .cpp  /  .def ) 示例: // a.h ...... #ifdef __cplusplus e ...

  4. VMware下CentOS7.6安装openGauss

    VMware 下 CentOS7.6(7.9)安装 openGauss centos 安装 这里我使用的是 vmware workstation Pro 15 虽然官网了解了一下 openGauss ...

  5. openGauss2.1.0在openEuler 20.03 LTS SP2 安装后,yum无法使用的问题解决

    openGauss2.1.0 在 openEuler 20.03 LTS SP2 安装后,yum 无法使用的问题解决 一.环境描述 操作系统: openEuler 20.03 LTS openEule ...

  6. 抓包整理————tcpdump过滤器[七]

    前言 简单介绍一下tcpdump 正文 这里可以tcpdump -D 可以列出各个网卡的信息: 默认抓取eth0,也就是第一个: 还有下面的选项: -D 举例所有的网卡设备 -i 选择网卡设备 -c ...

  7. allure常用

    overview:概述页面:categories:分类目录:suites:按套件和类分组的已执行测试的标准结构:graphs:图表:timeline:时间线:behaviors:可根据epic.fea ...

  8. 平安保险基于 SPI 机制的 RocketMQ 定制化应用

    ​简介:本文讲讲述平安保险为何选择 RocketMQ,以及在确定使用消息中间件后,又是如何去选择哪款消息中间件的. 作者:孙园园|平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什 ...

  9. 自己动手从0开始实现一个分布式RPC框架

    简介: 如果一个程序员能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现.负载均衡.序列化协议.RPC通信协议.Socket通信.异步调用.熔断降级等技术,可以全方位的提升基本素质 ...

  10. [Docker] 镜像源配置 for Linux

    $ vi /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.mirrors.ustc.edu ...