ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[原创] 8皇后排列问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-17 22:50 | 显示全部楼层
直到现在不明白,您这句:
“允许包含45度对称、但左右对称、上下对称旋转对称就不要了”
到底具指什么?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 08:25 | 显示全部楼层
aoe1981 发表于 2014-8-17 22:50
直到现在不明白,您这句:
“允许包含45度对称、但左右对称、上下对称旋转对称就不要了”
到底具指什么?

这一句就忽略吧。

我只是提醒,遍历计算设置不当,可能会得到大量重复解。

点评

还是希望看到您的代码,我的嵌套8层循环是很原始的求取组合的方法……不过,我到现在不确定能读得懂递归的组合算法……  发表于 2014-8-18 08:59

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 08:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2014-8-17 22:44
  最后补充一点:
  关于我的结果的表示:
  我没有采用香川的自然数序号的办法:1~64

8X8的行列坐标,很容易转化为一维坐标的,努力一下吧。

…………
虽然二维行列坐标很直观,但如果让计算机来记录的话,选择一维坐标记录是最好的。
你需要有这个概念。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 08:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 香川群子 于 2014-8-18 09:38 编辑

关于遍历检查次数,
首先所有皇后不能同行。
那么如果固定1号皇后在第1行、2号皇后在第2行、……
所有列组合算进去,是=8^8=16777216次。

但考虑到所有不能皇后不仅不能同行、也不能同列,
所以只需考虑全排列组合 =Fact(8)=40320次。

实际加上剪枝,需要检查的次数就大为减少了。
可以在0.01秒以内完成所有计算。
采用递归算法,实际运算次数如下:

queen8.jpg




点评

注意到一个陌生而神奇的概念:剪枝……心向往之,但恐力有不逮……  发表于 2014-8-18 12:53
豁,5508次,这个牛!!!  发表于 2014-8-18 12:51

TA的精华主题

TA的得分主题

发表于 2014-8-18 08:58 | 显示全部楼层
香川群子 发表于 2014-8-18 08:52
8X8的行列坐标,很容易转化为一维坐标的,努力一下吧。

…………

主要是我的核心判断部分是依据直角坐标进行的,选择一维是不是也要在这部分进行修改?还是,只是把结果最后转换一下?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 09:41 | 显示全部楼层
本帖最后由 香川群子 于 2014-8-18 09:43 编辑
aoe1981 发表于 2014-8-18 08:58
主要是我的核心判断部分是依据直角坐标进行的,选择一维是不是也要在这部分进行修改?还是,只是把结果最 ...

结果转换即可:

假定结果存放在二维数组b&(7, 7)中,那么代码如下:

  1. For x = 0 To 7
  2.     For y = 0 To 7
  3.         t = t + 1
  4.         If b(x, y) Then s = s & "," & t
  5.     Next
  6. Next
  7. c(k) = Mid(s, 2)
复制代码
实际转换只需92次,对速度毫无影响。

点评

多谢指点!  发表于 2014-8-18 12:41

TA的精华主题

TA的得分主题

发表于 2014-8-18 09:44 | 显示全部楼层
香川群子 发表于 2014-8-17 17:09
1        2        3        4        5        6        7        8
9        10        11        12        13        14        15        16
17        18        19        20        21        22        23        24

8x8有12个基础解,转换方式为:转90度、180度、270度,及上述4个的镜像

楼主代码是找出基础解的吗?

可否扩展到n皇后在nxn的棋盘上吗?n>3

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 10:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lee1892 发表于 2014-8-18 09:44
8x8有12个基础解,转换方式为:转90度、180度、270度,及上述4个的镜像

楼主代码是找出基础解的吗?

左右镜像对称,可以通过约束第1个皇后的检查位置减半来去除。

但其它各种旋转方式,难以事先简单排除。
当然,可以通过相应的转换、转置函数对结果进行字典比较排除重复。

…………
本题仅对初学者做思考练习用,所以暂不要求排除各种旋转和镜像对称。

呵呵。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 10:37 | 显示全部楼层
lee1892 发表于 2014-8-18 09:44
8x8有12个基础解,转换方式为:转90度、180度、270度,及上述4个的镜像

楼主代码是找出基础解的吗?

n=1 OK
n=2、n=3 时无解

n=4 有唯一解

…………
以后貌似都有解。

点评

代码要是能通用到n个皇后的时候自然是登峰造极的时候……  发表于 2014-8-18 12:58

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-18 10:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本题编程呢有2个关键之处:

1、如何遍历,保证不遗漏但又能减少循环次数

2、如何高效检查本次循环得到的皇后位置是否和之前的有冲突?

理论上需检查纵、横、斜的8个方向,
而实际上只需检查斜线方向……


而斜线的检查,如何高效进行?需要运用一些最基本的直角坐标知识。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-8 06:03 , Processed in 0.039753 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表