华容道的求解算法重写

大学时写的求解算法效率有点低,以横刀立马棋局求解极限约为1.5s因此根据重写一遍,目前只有java版本的 go版本的也写了

在最初的版本中,只考虑了关羽固定为横,四上将固定为竖的设计,不能符合全部的情形,因而重写。
依旧按照原来思路对棋局进行压缩,省掉了对四上将与曹操的坐标压缩,简化了计算过程,每个棋子横坐标为2位,纵坐标为3位,共十个棋子,总计50位。使用5位记录棋子的横竖方向和坐标加起来一共55位,小于long类型的64位。

求解算法方面
依旧是采用分支限界法进行求解,使用广度优先算法建立树并同步进行判定和剪枝。求解完成时间停止建树,以此来保证此解为全局最优解。
简单来说就是 BFS 方法搜索,采用数组模拟整个棋盘,剪枝的方式为对棋局求取特征值,对于具备相同特征的棋局,不再进行建树求解。

懒得做界面了,纯java命令行模式,可在idea中直接打开。
go版本的同理。

另外将所有可行的棋局都用枚举的方法计算出来了,数字代表的是横方向和总方向棋子的数量

github链接

使用缓存已经生成的棋局,单线程的极限速度要高于多线程的极限速度,可能是因为线程间的切换影响了求解的速度,在进行多棋局求解时,单线程明显优于多线程(每种类型的开局状态都已经求出了,可以根据开局自带的字典生成随机棋局),在单个棋局求解时,多线程相较于单线程稳定,都在300ms左右,单线程的速度也和多线程差不多(cpu : 10210U),go版本的速度约70ms,多线程也并未能有明显的进步,反而因为写的不规范造成几率死锁。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字华容道是一款经典的数字拼图游戏,目标是通过移动数字,将它们按照从小到大的顺序排列。下面是使用Python实现数字华容道还原算法的一种方法。 首先,需要定义一个游戏棋盘,使用一个二维数组来表示。棋盘的每个格子都包含一个数字。我们可以再定义一个目标状态的棋盘,即数字按照从小到大排列的状态。 接下来,我们需要实现一个能够找到空格的函数。空格在棋盘上用0表示。我们可以遍历整个棋盘,当遇到0时,即为找到了空格。 然后,我们需要实现一个能够移动数字的函数。移动数字涉及到将数字从一个位置移到另一个位置。我们可以使用上下左右四个方向来移动数字,但需要注意边界限制。如果移动操作是合法的,即数字可以移动到目标位置,我们可以通过交换数字的方式来实现移动。 接下来,我们需要实现一个还原算法。我们可以使用深度优先搜索算法来尝试所有的移动方式,直到找到一个使得当前棋盘与目标状态相同的解法。在每一步搜索中,我们可以尝试移动空格周围的数字,不断递归搜索下一个状态,直到找到解法或者无解。 最后,我们可以通过输入一个初始状态的棋盘,调用还原算法,并输出还原的步骤以及最终的还原结果。 以上就是一个使用Python实现数字华容道还原算法的一种方法。实际的算法实现可能会有所不同,但基本的思路是类似的。通过定义棋盘、移动函数和还原算法等,我们可以实现一个自动还原数字华容道的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值