大学时写的求解算法效率有点低,以横刀立马棋局求解极限约为1.5s因此根据重写一遍,目前只有java版本的 go版本的也写了
在最初的版本中,只考虑了关羽固定为横,四上将固定为竖的设计,不能符合全部的情形,因而重写。
依旧按照原来思路对棋局进行压缩,省掉了对四上将与曹操的坐标压缩,简化了计算过程,每个棋子横坐标为2位,纵坐标为3位,共十个棋子,总计50位。使用5位记录棋子的横竖方向和坐标加起来一共55位,小于long类型的64位。
求解算法方面
依旧是采用分支限界法进行求解,使用广度优先算法建立树并同步进行判定和剪枝。求解完成时间停止建树,以此来保证此解为全局最优解。
简单来说就是 BFS 方法搜索,采用数组模拟整个棋盘,剪枝的方式为对棋局求取特征值,对于具备相同特征的棋局,不再进行建树求解。
懒得做界面了,纯java命令行模式,可在idea中直接打开。
go版本的同理。
另外将所有可行的棋局都用枚举的方法计算出来了,数字代表的是横方向和总方向棋子的数量