ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 8皇后排列问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-31 11:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
湊个热闹,递归算法,92种解,结果放在数组中,未进行外显处理
  1. Dim Queen() As Integer '数组索引为 行号,值为 列号
  2. Dim arrResult As Variant

  3. Sub Main()
  4.     ReDim Queen(1 To 8) As Integer
  5.     FindPlace 1
  6.     MsgBox "共有【" & UBound(arrResult, 2) & "】组解"
  7. End Sub

  8. Function FindPlace(intCurRowID As Integer)
  9.     Dim intColID As Integer, intNextRowID As Integer
  10.    
  11.     For intColID = 1 To 8
  12.         If CanPlaced(intCurRowID, intColID) Then
  13.             Queen(intCurRowID) = intColID
  14.             If intCurRowID = 8 Then
  15.                 GetResult
  16.                 Exit Function
  17.             End If
  18.             intNextRowID = intCurRowID + 1
  19.             FindPlace intNextRowID
  20.         End If
  21.     Next
  22.     Queen(intCurRowID) = 0
  23. End Function

  24. Function CanPlaced(intCurRowID As Integer, intCurColID As Integer) As Boolean
  25.     Dim intRow As Integer
  26.    
  27.     For intRow = 1 To intCurRowID - 1
  28.         '同一列有皇后
  29.         If Queen(intRow) = intCurColID Then
  30.             CanPlaced = False
  31.             Exit Function
  32.         End If
  33.         '同一主对角线(行号+列号 相等)
  34.         If intRow + Queen(intRow) = intCurRowID + intCurColID Then
  35.             CanPlaced = False
  36.             Exit Function
  37.         End If
  38.         '同一主对角线(行号-列号 相等)
  39.         If intRow - Queen(intRow) = intCurRowID - intCurColID Then
  40.             CanPlaced = False
  41.             Exit Function
  42.         End If
  43.     Next
  44.     CanPlaced = True
  45. End Function

  46. Sub GetResult()
  47.     Dim lngCol As Long, lngRow As Integer
  48.    
  49.     If IsArray(arrResult) Then
  50.         lngCol = UBound(arrResult, 2) + 1
  51.         ReDim Preserve arrResult(1 To 8, 1 To lngCol) As Integer
  52.     Else
  53.         lngCol = 1
  54.         ReDim arrResult(1 To 8, 1 To 1) As Integer
  55.     End If
  56.     For lngRow = LBound(Queen) To UBound(Queen)
  57.         arrResult(lngRow, lngCol) = Queen(lngRow)
  58.     Next
  59. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-3-31 12:08 | 显示全部楼层
楼上的有效性判断,基于下图所示
{6D0B422D-CEB1-4985-AA35-5ED2A08C34CC}_20200331120743.jpg

TA的精华主题

TA的得分主题

发表于 2022-1-23 09:41 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 11:23 , Processed in 0.034764 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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