在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

使用回溯法,总共92种摆法。

判断当前行destRow的赋值是否满足条件:(假定其他行为curRow)

  • 不在同一行:肯定不在同一行,因为是按照行来进行赋值的。
  • 不在同一列:pData[curRow] != pData[destRow]
  • 不在对角线上:std::abs(pData[curRow] - pData[destRow]) != std::abs(curRow - destRow)

下面给出代码:

#include <iostream>
#include <cstdlib>const int QUEUE_COUNT = 8;
int CUR_OUTPUT_QUEUE_COUNT = 0;bool CheckValid(int* pData, int destRow)
{for (int curRow = 0; curRow < destRow; ++curRow){if (pData[curRow] == pData[destRow]/*不在同一列*/ || std::abs(pData[curRow] - pData[destRow]) == std::abs(curRow - destRow)/*不在对角线上*/)return false;}return true;
}void PrintQueue(int* pData)
{if (nullptr == pData) return;++CUR_OUTPUT_QUEUE_COUNT;std::cout << "第" << CUR_OUTPUT_QUEUE_COUNT << "种解法" << std::endl;std::cout << "-----------------------------------------" << std::endl;for (int curRow = 0; curRow < QUEUE_COUNT; ++curRow) // 行{int destCol = pData[curRow];for (int curCol = 0; curCol < QUEUE_COUNT; ++curCol) // 列{if (destCol == curCol) std::cout << "+ ";else std::cout << "o ";}std::cout << std::endl;}std::cout << "-----------------------------------------" << std::endl;
}//
void SearchEightQueue(int* pData, int curRow)
{if (nullptr == pData || curRow < 0) return;if (curRow == QUEUE_COUNT) // 这里一定是等于QUEUE_COUNT, 而不是等于QUEUE_COUNT - 1{PrintQueue(pData);return;}for (int curCol = 0; curCol < QUEUE_COUNT; ++curCol) {pData[curRow] = curCol;// 给curRow行赋值if (CheckValid(pData, curRow)) SearchEightQueue(pData, curRow + 1); // 检测上面的赋值是否满足条件}
}void SearchEightQueue()
{int datas[QUEUE_COUNT] = { 0 };SearchEightQueue(datas, 0);
}int main()
{SearchEightQueue();return 0;
}

输出为:

第1种解法
-----------------------------------------
+ o o o o o o o
o o o o + o o o
o o o o o o o +
o o o o o + o o
o o + o o o o o
o o o o o o + o
o + o o o o o o
o o o + o o o o
-----------------------------------------
第2种解法
-----------------------------------------
+ o o o o o o o
o o o o o + o o
o o o o o o o +
o o + o o o o o
o o o o o o + o
o o o + o o o o
o + o o o o o o
o o o o + o o o
-----------------------------------------
第3种解法
-----------------------------------------
+ o o o o o o o
o o o o o o + o
o o o + o o o o
o o o o o + o o
o o o o o o o +
o + o o o o o o
o o o o + o o o
o o + o o o o o
-----------------------------------------
...
...
...
第90种解法
-----------------------------------------
o o o o o o o +
o + o o o o o o
o o o o + o o o
o o + o o o o o
+ o o o o o o o
o o o o o o + o
o o o + o o o o
o o o o o + o o
-----------------------------------------
第91种解法
-----------------------------------------
o o o o o o o +
o o + o o o o o
+ o o o o o o o
o o o o o + o o
o + o o o o o o
o o o o + o o o
o o o o o o + o
o o o + o o o o
-----------------------------------------
第92种解法
-----------------------------------------
o o o o o o o +
o o o + o o o o
+ o o o o o o o
o o + o o o o o
o o o o o + o o
o + o o o o o o
o o o o o o + o
o o o o + o o o
-----------------------------------------

28. (附加)八皇后问题(C++版本)相关推荐

  1. Java实现八皇后问题的解法(一维数组版本)

    最近接触了数据结构与算法,这本该是计算机专业的同学大一就掌握的课程,可我现在才算正式接触,感到惭愧万分.但闻道有先后,术业有专攻.本篇博客开始记录本人学习数据结构与算法这门课的点滴,希望自己能坚持下去 ...

  2. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  3. Scheme来实现八皇后问题(2)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/9790466.html 作者:窗户QQ/ ...

  4. 洛谷 P1219 八皇后

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  5. [OpenJudge] 百练2754 八皇后

    八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. ...

  6. 程序员面试题精选100题(58)-八皇后问题[算法]

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法 ...

  7. 回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...

  8. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...

  9. 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里插入图片描述 第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对 ...

  10. 八皇后问题 递归求解法

    #include <iostream> #include <fstream> #include <string.h>/** 八皇后问题递归方法实现 */ using ...

最新文章

  1. 英国加密期货交易所增加比特币现金合约
  2. 人脸识别数据集bin解压
  3. 获取文件名和路径函数
  4. Linux服务器下安装配置Nginx的教程
  5. SQL转换函数to_char/to_date/to_number
  6. OpenGL Lightmap光照贴图的实例
  7. Android UI开发第二篇——多级列表(ExpandableListView)
  8. CodeForces - 1267K Key Storage(组合数学)
  9. Angular async pipe在Component html模板中的一个实际应用
  10. 打印user在指定时间段内做过的personalization detail
  11. android viewpage预加载和懒加载问题
  12. 进程是如何使用内存的?
  13. 【SAP HANA】关于SAP HANA中带层次结构的Analytic View创建、激活状况下在系统中生成对象的研究...
  14. python机器学习案例系列教程——最小生成树(MST)的Prim算法和Kruskal算法
  15. 使用QRCode轻松实现二维码扫描下载的功能
  16. 详解谷歌浏览器 performance 选项卡
  17. 本周最新文献速递20220327
  18. 月均数据_三季度前20强券商私募资管月均规模下降逾7000亿元 这5家主动规模占比已超50%...
  19. 【Nova】nova-consoleauth学习
  20. 【告别小白】什么是标志性语言?

热门文章

  1. FileZilla Server远程管理
  2. javascript正则表达式---正向预查
  3. 正则表达式3-兄弟的回复
  4. Linux之-atime、ctime、mtime
  5. eclipse进度条从后台还原到前台
  6. FireFox 插件SQLite Manager 学习
  7. Exchange 2013 OU大于500新建用户无法查询OU
  8. Server 2012 Log off 按键
  9. 获取图层字段的唯一值集合(ArcEngine)
  10. 5.微服务设计 --- 分解单块系统