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

  1. #pragma once
  2. #include"Position.h"
  3. #include<vector>
  4. #include<array>
  5. using std::array;
  6. using std::vector;
  7.  
  8. class QueenGame
  9. {
  10. private:
  11. const int SIZE = 9;
  12. int getCount;
  13. int count;
  14. Position* posArr;
  15. clsArr pA;
  16. vector<clsArr>vecResult;
  17. bool PosIsOK(int x, int y);
  18. public:
  19. QueenGame(int n = 8) {
  20. count = n;
  21. getCount = 0;
  22. posArr = new Position[count];
  23. }
  24. ~QueenGame() {
  25. delete[]posArr;
  26. }
  27. QueenGame(const QueenGame& q) {
  28. this->count = q.count;
  29. this->getCount = q.getCount;
  30. this->posArr = new Position[q.count];
  31. for (size_t i = 0; i < q.count; i++)
  32. {
  33. this->posArr[i] = q.posArr[i];
  34. }
  35. }
  36. const vector<clsArr> GetResult()const {
  37. return vecResult;
  38. }
  39. void Play(int x, int y);
  40. };
定义:
  1. #include "QueenGame.h"
  2. #include"Position.h"
  3. #include<math.h>
  4. bool QueenGame::PosIsOK(int x, int y) {
  5.  
  6. for (size_t i = 0; i < count; i++)
  7. {
  8. Position pos = pA[i];
  9.  
  10. if (pos.x <= 0 && pos.y <= 0) {
  11. continue;
  12. }
  13. if (x == pos.x || y == pos.y) {
  14. return false;
  15. }
  16. else {
  17. if (std::abs((x - pos.x) * 1.0 / (y - pos.y)) == 1) {
  18. return false;
  19. }
  20. }
  21. }
  22. return true;
  23. }
  24. void QueenGame::Play(int x, int y) {
  25. if (x >= SIZE && y >= SIZE) {
  26. return;
  27. }
  28. for (; y < SIZE; y++)
  29. {
  30. if (PosIsOK(x, y)) {
  31. Position pos(x, y);
  32.  
  33. *(posArr + (getCount)) = pos;
  34. pA[getCount] = pos;
  35. ++getCount;
  36. if (x < SIZE - 1) {
  37. Play(x + 1, 1);
  38. }
  39. else {
  40. int sss = 0;
  41. if (getCount == count) {
  42. vecResult.push_back(pA);
  43. pA[--getCount].set(-1, -1);
  44.  
  45. continue;
  46. }
  47.  
  48. }
  49. }
  50. }
  51. if (getCount >= 0)
  52. {
  53. --getCount;
  54. posArr[getCount].set(-1, -1);
  55. pA[getCount].set(-1, -1);
  56. }
  57. return;
  58. }

运行:

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

辅助类:

  1. struct Position
  2. {
  3. int x;
  4. int y;
  5.  
  6. Position(int a, int b) {
  7. x = a;
  8. y = b;
  9. }
  10. Position() {
  11. x = -1;
  12. y = -1;
  13. }
  14. void set(int a, int b) {
  15. x = a;
  16. y = b;
  17. }
  18. };
  19. class clsArr {
  20. public:
  21. Position pos[8];
  22. Position& operator[](int i) {
  23. return pos[i];
  24. }
  25. };

【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. RabbitMQ 04 直连模式-Java操作

    使用Java原生的方式使用RabbitMQ现在已经较少,但这是基础,还是有必要了解的. 引入依赖. <dependency> <groupId>com.rabbitmq< ...

  2. 构筑立体世界,AR Engine助力B站会员购打造沉浸式营销

    随着购物场景的逐渐多元化,越来越多电商平台把线下购物体验搬到线上,运用AR技术,跨越空间距离,帮助用户在购买前"体验"商品,增强购买意愿. 哔哩哔哩会员购(后称会员购)是B站于20 ...

  3. Ansible 学习笔记 - 批量巡检站点 URL 状态

    前言 不拖泥带水,不东拉西扯. 速战速决,五分钟学到一个工作用得上的技巧. 通过一个个具体的实战案例,来生动演示 Ansible 的用法. 需求 我需要定期巡检或定时监控我公司的所有站点的首页的可用性 ...

  4. centos8 \CentOS 9 Stream rpm 安装mysql8.0.28

    centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...

  5. 树莓派和esp8266之间使用tcp协议通信

    树莓派代码: from flask import Flask, render_template import socket import threading app = Flask(__name__) ...

  6. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-39-highlight() 方法之追踪定位

    1.简介 在之前的文章中宏哥讲解和分享了,为了看清自动化测试的步骤,通过JavaScript添加高亮颜色,就可以清楚的看到执行步骤了.在学习和实践Playwright的过程中,偶然发现了使用Playw ...

  7. 力扣1132(MySQL)-报告的记录Ⅱ(中等)

    题目: 编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位. Actions 表: Removals 表: Result 表: 2019-07 ...

  8. 第 10 章 使用pyecharts 进行数据展示

    第 10 章 使用pyecharts 进行数据展示 10.1 安装 pyecharts pyecharts 是一个用于生成 Echarts 图表的类库, Echarts 是百度开源的一个数据可视化JS ...

  9. 科普达人丨一图看懂阿里云ECS

    简介: 建议收藏  原文链接:https://click.aliyun.com/m/1000363154/ 本文为阿里云原创内容,未经允许不得转载.

  10. 直播回顾:准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核?| 龙蜥技术

    ​简介: 你还在为分析机器负载高而苦恼?这款 ssar 工具独创 load5s 指标精准定位超硬核. 编者按:本文整理自龙蜥SIG技术周会,作者闻茂泉,阿里云计算平台事业部SRE运维专家,是龙蜥社区跟 ...