为:在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. Python语言Numpy包之Meshgrid 函数

    Meshgrid 函数的基本用法 在 Numpy 的官方文章里, meshgrid 函数的英文描述也显得文绉绉的,理解起来有些难度.可以这么理解, meshgrid 函数用两个坐标轴上的点在平面上画网 ...

  2. HDC2021技术分论坛:DevEco Testing,新增分布式测试功能

    作者:lixiao,华为终端软件测试首席架构师:mindelong,华为终端软件测试工程师 HarmonyOS自诞生以来,致力于提供全场景智慧解决方案,打造分布式流转.多设备协同的分布式体验.全新解决 ...

  3. AI数字人直播优势凸显,那么该如何打造AI数字人直播间?

    近年来,我们听到了很多无人直播间,数字人直播间这些名词,很多人会好奇这到底是什么意思,没人还可以直播吗?那什么是AI数字人直播? AI数字人是用真人拍摄五分钟高清视频上传到青否数字人克隆端,生成的数字 ...

  4. vscode使用npm安装依赖报错

    1.报错信息 npm ERR! code EPERM npm ERR! syscall open npm ERR! path C:\Node\node_cache_cacache\index-v5\4 ...

  5. 聊聊 Linux iowait

    哈喽大家好,我是咸鱼. 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候,往往看的是下面这一列: %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 ...

  6. Pandas+ SLS SQL:融合灵活性和高性能的数据透视

    简介: Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具.Pandas擅长处理数字型数据和时间序列数据.Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需 ...

  7. 从KPI到OKR,高阶产品人如何推动业务高速增长

    简介: 不管是核心大目标,还是O(Objectives),或者北极星指标,奇妙等式等等,最后都需要核心组织协同方式来推动整个目标聚焦以及过程的落地. 作为产品经理人,相信很多人都遇到过以下的灵魂拷问: ...

  8. 一站式云原生智能告警运维平台——SLS新版告警发布!

    简介: 本文介绍什么是云原生可观测性需求以及告警限制,介绍一站式云原生智能告警运维平台--SLS新版告警. 前言 本篇是SLS新版告警系列宣传与培训的第一篇,后续我们会推出20+系列直播与实战培训视频 ...

  9. 前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布

    ​简介: 本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云资深技术专家 魏闯先关于"AnalyticDB PostgreSQL年度新版本发布&qu ...

  10. 项目实战总结以及接入U-APM

    ​简介: 导致 App 性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线.系统函数.编程范式.数据结构等导致的.即便是较有经验的程序员,也很难在开发时就能避免所有导致 ...