ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 474|回复: 5

[求助] 请教如何用Python编写一个破解类似数独谜题的小工具

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-10 11:48 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最近尝试用python编写一个小工具,但是小白一个,只会基础的逻辑,不会复杂的专业代码。

尝试用AI编写了一个程序,但是总有各种问题,没办法达到理想的效果。

希望有大佬帮忙看下要怎么优化AI提示词,或者帮忙看下代码哪里有问题,如果能优化解题方式就更好了,感谢大佬!

另外还有个想请教一下的就是,怎么直接抓取网址中的谜题,或者识别图片自己加载谜题。

这个工具的目的是用于破解一个类似数独的系列谜题,谜题名字叫【星系】也有叫【对称之美】的。

谜题原地址:https://cn.puzzle-galaxies.com/

游戏柜子说明:
星系 也被称为“螺旋星系”,是一个规则简单且富有挑战性的逻辑谜题。游戏规则 很简单。 您必须按照以下方式将网格划分为不同区域(星系):
- 每个区域有且仅有 1 个白色圆圈。
- 圆圈是其中心对称点。 也就是说,区域如果围绕圆圈旋转 180°,您应该获得相同形状、位置和方向的区域。




下面是我给AI的提示词:

以这道题为例,设计一个pyhton解题器,并对代码进行标注
0,0,1,1,0
0,0,1,1,0
2,0,3,3,0
0,0,4,4,0
0,0,5,5,0
默认设定:1、将题目设置为5乘5棋盘形式,题目数字可以自行输入,并且默认全为0,单击后全选已有数字,方便直接录入数字;2、提供一个生成谜题按钮(将题目输出一个初始棋盘),和开始解题按钮;3、题目中0是“空地”,非0数字是互不相关的“城”,解题中,用0修改成其他数字时,称为对应数字的“领地”4、“城”的数字不得修改
解题数学逻辑:1、设定坐标系,左上为(1,1),右下为(5,5);2、把每个格子的信息进行记录,信息包括【序号】【坐标】【原始数字标记】【临时数字标记】【是否为“城”】【“城中心”】【是否有相同数字的180度对称格子】【可归属城数量】等3、把所有“城”的中心点进行记录,录入“城中心”;中心点只能是0.5级别的小数坐标或者整数坐标;把每个“城”录入信息,【城序号】【城中心】【城原始坐标】4、检验已知“城”占领格子,非0格子是否都能围绕相同数字的“城中心”找到已标注了相同数字的180度中心对称格子。如果存在“城”本身是非180度中心对称的,则停止做题,提示对应数字的城,非180度中心对称。如果都符合180度中心对称,则继续做题5、城只有1格,2格,4格三种情况6、从数字最小的4格城开始,尽可能扩展领地。7、拓展方式,先检测N号城上下左右相邻的所有空地,逐个成对拓展领地;8、拓展领地时,所有格子(x,y)必须以相同数字的“城中心”(a,b)找到另一个相同数字的格子(2a-x,2b-y)9、拓展完一次后,需要再次检测目前N号城及N号领地上下左右相邻的所有空地,逐个成对拓展领地;直至无法再拓展;10、4格城都拓展完毕后,然后再拓展2格城,再拓展1格城11、最后检查是否还有剩余空格

在之前的结果基础上,用递归回溯算法,对剩余空格二次尝试;测试方式如下:1、先确认所有剩余空格坐标;2、计算每个空格可对称的城的数量(此时的可对称判定条件为:对称位置不为城且不超范围即可)3、按可对称数量从小到大进行尝试;4、测试时,在空格填入测试值时,测试空格的对称位置A改为测试值,对称位置A原本的对称位置B,改为0,变更为空地。5、重新按1到4方式不断测试,直到没有空格。

提供算法步骤日志,每拓展完一个城,就输出一个解题步骤棋盘,不限制长度,我不介意网页很长,我需要确认每个步骤的算法是正确的
二次尝试时,强制每次修改都输出一次日志,要求需要能体现是哪个逻辑出错,以便检查。


递归回溯推导。

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-10 11:50 | 显示全部楼层


参考谜题和答案图片

谜题1

谜题1

答案1

答案1

======================

谜题2

谜题2

答案2

答案2





我降低到5乘5的棋盘说明一下:

以这道题为例,解释一下目前的算法步骤
坐标系我定的是左上为(1,1),右下(5,5)

0,0,1,1,0
0,0,1,1,0
2,0,3,3,0
0,0,4,4,0
0,0,5,5,0

城1:四格城,原始位置:(3,1)(4,1)(3,2)(4,2)
城2:单格城,原始位置:(1,3)
城3:双格城,原始位置:(3,3)(4,3)
城4:双格城,原始位置:(3,4)(4,4)
城5:双格城,原始位置:(3,5)(4,5)

城1:中心点:(3.5,1.5)
城2:中心点:(1,3)
城3:中心点:(3.5,3)
城4:中心点:(3.5,4)
城5:中心点:(3.5,5)

阶段1:领地拓展
拓展顺序,先按四格城,双格城,单格城;再按数字排序

先拓展1号城:
1号城接壤空地:(2,1)(5,1)(2,2)(5,2)
尝试(2,1),
(2,1)以城1中心点(3.5,1.5)的对称点是(5,2),且格子属性为【空地】,将(2,1)和(5,2)改写为1,算做1的领地。


以此类推,得出
0,1,1,1,1
0,1,1,1,1
2,0,3,3,0
0,0,4,4,0
0,0,5,5,0


再次计算1号城接壤空地:(1,1)(1,2)(2,3)(5,3)
尝试(1,1),

(1,1)以城1中心点(3.5,1.5)的对称点是(6,2),6超出范围,不成立,这个格子不能拓展。

都尝试下来,1号城无可拓展领地

得出,1号城无可拓展领地
0,1,1,1,1
0,1,1,1,1
2,0,3,3,0
0,0,4,4,0
0,0,5,5,0


再下来尝试双格城,依次查3号城,4号城,5号城

得出,3号城可拓展领地

0,1,1,1,1
0,1,1,1,1
2,3,3,3,3
0,0,4,4,0
0,0,5,5,0

得出,4号城可拓展领地

0,1,1,1,1
0,1,1,1,1
2,3,3,3,3
0,4,4,4,4
0,0,5,5,0

得出,5号城可拓展领地

0,1,1,1,1
0,1,1,1,1
2,3,3,3,3
0,4,4,4,4
0,5,5,5,5


再下来尝试单格城,2号城

遍历拓展后

得出,2号城可拓展领地

2,1,1,1,1
2,1,1,1,1
2,3,3,3,3
2,4,4,4,4
2,5,5,5,5

题目得解
2,1,1,1,1
2,1,1,1,1
2,3,3,3,3
2,4,4,4,4
2,5,5,5,5



上面这种题目,AI基本都能秒答


TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-10 11:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上面例题为简单示例
接下来这题用来测试复杂点情况
0,0,0,0,0
0,0,1,1,0
3,3,0,0,2
0,0,4,4,0
0,0,4,4,0


城1:双格城,原始位置:(3,2)(4,2)
城2:单格城,原始位置:(5,3)
城3:双格城,原始位置:(1,3)(2,3)
城4:四格城,原始位置:(3,4)(4,4)(3,5)(4,5)

城1:中心点:(3.5,2)
城2:中心点:(5,3)
城3:中心点:(1.5,3)
城4:中心点:(3.5,4.5)



同理,先拓展4号城(四格城)
0,0,0,0,0
0,0,1,1,0
3,3,0,0,2
0,4,4,4,4
0,4,4,4,4

拓展1号城(双格城)
0,0,1,1,0
0,1,1,1,1
3,3,1,1,2
0,4,4,4,4
0,4,4,4,4

拓展3号城(双格城)【无可拓展】
0,0,1,1,0
0,1,1,1,1
3,3,1,1,2
0,4,4,4,4
0,4,4,4,4

拓展2号城(单格城)【无可拓展】
0,0,1,1,0
0,1,1,1,1
3,3,1,1,2
0,4,4,4,4
0,4,4,4,4

接下来是跟上一题不一样的地方,需要进行二次校对
需要遍历剩余空格,直接找到可对称的点位,强制改写
我给AI提示的是用递归遍历法去尝试。
但是AI老是把可修改得【领地】标记成不可修改得【城市】属性



回复的字符数有限制,我分段发一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-10 11:52 | 显示全部楼层
接上一段,

我希望的步骤如下:

先检查当前剩余空格:(1,1)(2,1)(5,1)(1,2)(1,4)(1,5)
先查(1,1)的可能对称点有几个【对称点计算方式,点(x,y),中心点(a,b),对称点为(2a-x,2b-y)】

城1:中心点:(3.5,2)   【(1,1)对称点(6,2),6超出范围,不可用】
城2:中心点:(5,3)      【(1,1)对称点(9,5),9超出范围,不可用】
城3:中心点:(1.5,3)   【(1,1)对称点(2,5),范围内,且非原始的城,当前为领地,可用】
城4:中心点:(3.5,4.5)【(1,1)对称点(6,8),6超出范围,不可用】


因此(1,1)只有一个对称的点位


同时计算剩余几个剩余空格的可对称点位
(1,1)【1个】
(2,1)【1个】
(5,1)【1个】
(1,2)【1个】
(1,4)【1个】
(1,5)【1个】


按可对称点位最少的,坐标靠前的依次尝试

尝试(1,1)空格的对称位(2,5),当前为4号城领地,将(2,5)清空为空格,同时将(2,5)的原对称位(5,4)也清空为空格


得出【尝试(1,1)为3】
3,0,1,1,0
0,1,1,1,1
3,3,1,1,2
0,4,4,4,0
0,3,4,4,4

接下来沿着(5,4)继续递归尝试
(5,4)可对称的点位(2,5)(5,2)【(2,5)为递归的上级尝试点,先尝试其他点位】


得出【尝试(5,4)可对称的点位(5,2)为2,同时将旧对位(2,2)清空】
3,0,1,1,0
0,0,1,1,2
3,3,1,1,2
0,4,4,4,2
0,3,4,4,4

接下来沿着(2,2)继续递归尝试
(2,2)可对称的点位(1,4)(2,5)【(2,5)为递归的上级尝试点,先尝试其他点位】


得出【尝试(2,2)可对称的点位(1,4)为3,同时因对位(1,4)为空值,此链路推导停止,切换下一空格】
3,0,1,1,0
0,3,1,1,2
3,3,1,1,2
3,4,4,4,2
0,3,4,4,4

接下来检查当前剩余空格:(2,1)(5,1)(1,2)(1,5)【注:(1,1)(1,4)在上一轮已完成标记】


先查可能对称点数量

(2,1)【1个】
(5,1)【1个】
(1,2)【1个】
(1,5)【1个】


同理,推导下一步
3,3,1,1,0
0,3,1,1,2
3,3,1,1,2
3,4,4,4,2
3,3,4,4,4


同理,推导下一步
3,3,1,1,0
3,3,1,1,2
3,3,1,1,2
3,3,4,4,2
3,3,4,4,0

同理,推导下一步
3,3,1,1,2
3,3,1,1,2
3,3,1,1,2
3,3,4,4,2
3,3,4,4,2


至此谜题得解
3,3,1,1,2
3,3,1,1,2
3,3,1,1,2
3,3,4,4,2
3,3,4,4,2

这题因为棋盘比较小,空格都是唯一解,当棋盘扩大到10*10,20*20,30*30,容易出现多个可对称点的剩余空格,这时候就需要

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-11 11:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-4-11 16:13 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-5 12:52 , Processed in 0.026596 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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