国庆期间三国杀移动版公众号搞了个网页游戏曹瞒走华容,通关可以奖励史诗宝珠,还有一堆宝箱。一开始20关比较简单,眼睛看看很快就能搞定,但是30关之后难度明显上去了,当步数增加到13以上很难一次性搞定,而一天就5条命,基本不够用。想想华容道这种规则简单的游戏,计算机穷举一下分分钟就搞定了,写个迭代程序也就个把小时,就当连个手。

华容道的规则我就不说了,小学就玩过了,下面说一下建模,界面长这样:

整个区域是一个6x6的正方形,可以用二维数组表示,横的长方形只能横向移动,用负数表示,同一行内如果有多个横向长方形,依次为-1,-2,-3…,哪个是-1无所谓,只要不同长方形数字不一样就行。目的是为了防止拼在一起无法辨认是一个还是2个。竖的长方形只能纵向移动,用正数表示,同一列有多个用1,2,3…表示。6阶矩阵长方形长度不是2就是3,所以最多也就是到正负2而已。曹操和竖直长方形一样,只能上下移动,用数字8表示。曹操到达龙的嘴巴[0, 2]为胜利条件。另外每关限定步数,用depth表示。于是上面两幅图可以表示为:

算法:

  1. 函数Step为递归函数,给一个矩阵和剩余步数作为参数,依次遍历每个长方形,长方形往每一个可移动方向移动一步,同时depth-1生成一个新的矩阵最为迭代输入。
  2. 当曹操走到[0, 2]为胜利条件,当步数depth用完为终止条件。

上述模型在30关前(13步左右)都工作良好,但是之后的关卡运算时间迅速飙升。于是不得不增加一些新的判断条件,作为剪枝:

  1. 如果上一步动了一个长方形,下一步就不动这个长方形,防止原地转圈
  2. 如果移动一个长方形并没有让别的长方形活动范围更大,就不动这个长方形

剪枝之后速度大大加快几乎所有关卡都能cover。但是在有个53关(24步)还是出现了算了几个小时都没算完的情况。于是分析了一下复杂度,假设每步都有3个长方形可以移动,24步的关卡一般21步能做完,游戏会放3步余量,这样3^21 = 10460*10^6, 而我的计算机1秒能处理10^6步,大约需要3小时,如果每步有3.5个长方形可以移动就需要70多小时。于是又设计了第二种剪枝算法:

  1. 函数Step为递归函数,给一个矩阵,剩余步数,下一步的候选长方形数组作为参数,依次遍历数组中的每个长方形,长方形往每一个可移动方向移动一步,同时depth-1,并生成下一步的候选人列表,生成一个新的矩阵最为迭代输入。
  2. 当曹操走到[0, 2]为胜利条件,当步数depth用完为终止条件。
  3. 候选人列表生成方法:
    1. 假设移动长方形X之后,导致活动范围增加的长方形为Y(Y可能有多个)
    2. 假设X是(横/竖)长方形,(竖/横)长方形Y在X的(上/下/左/右)侧,X对面(下/上/右/左)有个长方形Z,横竖状态和X一致,挪动Z可以使Y的活动范围进一步扩大。
    3. Y和Z都作为移动X之后的下一步一移动候选人(挨个遍历)

举个例子:

从图1变到图2,红方块(X)往上移动2格,这样左边的蓝方块(Y)活动范围大了1格,所以蓝方块(Y)就是下一步的候选人之一。同时,黄方块(Z)在红方块(X)的另一侧,且黄方块(Z)也可以移动,如果黄方块(Z)往上移动2格,蓝方块(Y)的活动范围可以从1格进一步扩大至3格,这样黄方块也可以是下一步的候选人。

这种剪枝方法比较狠,直接把底数从3降到1.X。即便是25步以上的关卡都能几秒出结果。副作用是这种算法只适合串行操作的关卡,如果一个关卡必须由2个独立的入口分别操作,到某一步的时候合并起来,这样就无法cover了,这种情况必须回到第一种算法。

运行的方法以上面的13关为例,先配置二维数组a和depth,然后VC里面点运行,结果如下图

从下往上看,就是一步一步的过程。界面虽然丑陋了些,输入麻烦了些,但是很管用。核心算法也就500行不到,但是设计的过程中有很多坑,导致预计个把小时的程序搞了2天。

算法1代码:https://download.csdn.net/download/hunterhuuuu/28081454

算法2代码:https://download.csdn.net/download/hunterhuuuu/28081746

计算机辅助曹瞒走华容(华容道)算法相关推荐

  1. JAVA算法:走迷宫回溯算法设计(JAVA版本)

    JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = {                 {0, 1, 0, 0, 0},                 {0, ...

  2. 数字华容道算法生有解

    数字华容道NxN数字随机排列的阵列有解的充要条件是: N为奇数,总逆序数为偶数, N为偶数,总逆序数为奇数. --数字华容道算法2*2-10*10 --随机生成有解算法 --作者,韩永旗 --迷你号2 ...

  3. 华容道算法之性能优化

    上篇文章讲解了华容道算法基本算法知识,也是最简单的,效率也是最低的.这篇文章讲解高效率算法.从下篇文章开始主要分析linux  驱动代码以及嵌入式相关设计知识.本次编码采用棋子在棋盘中的位置编码,顺序 ...

  4. python迷宫问题算法_Python解决走迷宫问题算法示例

    本文实例讲述了Python解决走迷宫问题算法.分享给大家供大家参考,具体如下: 问题: 输入n * m 的二维数组 表示一个迷宫 数字0表示障碍 1表示能通行 移动到相邻单元格用1步 思路: 深度优先 ...

  5. python数字华容道算法_用React写一个数字华容道,你需要知道的秘密

    还在上班?很无聊? 这个叫前言 年末了.哦,不,要过年了.以前只能一路站到公司的我,今早居然是坐着过来的.新的一年,总要学一个新东西来迎接新的未来吧,所以选择了一直未碰的那个据说是全宇宙最牛逼的前端框 ...

  6. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  7. 全国环游怎么走----蚁群算法

    正在看数学建模的算法,这里讲蚁群算法拿出来做了个全国省会级城市旅游路线最短问题(TSP),使用matlab实现. 蚁群算法思想 (1)根据具体问题设置多只蚂蚁,分头并行搜索. (2)每只蚂蚁完成一次周 ...

  8. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

  9. 图神经网络之图游走类模型算法——DeepWalk

    目录 图游走类算法 目标 基本思路 Word2vec 算法思想 整体架构 Skip Gram--根据中心词预测上下文 Negative Sampling--负采样 应用到图嵌入领域 DeepWalk ...

最新文章

  1. Bitbucket Pipes发布,带来30+自动化CI/CD管道的方法
  2. [ATF]-ATF的RT_SVC的详解(runtime service)
  3. cuda core和sp
  4. Linux能适应不同的指令集,(转)linux常用指令集
  5. 吴恩达《深度学习》 学习笔记1
  6. 【干货】如何搭建靠谱的数据仓库.pdf(附下载链接)
  7. 郭宏志的android无线点餐系统,Android无线点餐系统--含代码.doc
  8. 吴恩达机器学习视频学习笔记(2)
  9. bing翻译api php,PHP调用必应翻译API示例源码
  10. 超级终端连接华为交换机_小编解决win8系统使用超级终端连接华为交换机的设置步骤...
  11. 教你App如何上架应用宝----腾讯开放开发平台
  12. HTML form元素
  13. 腾讯电竞广泛布局,难逃城市同质化怪圈?
  14. First part of my Spring posts is refreshed
  15. html中一个div中每行文字都有虚线怎么写,怎么定义每一行的文字下面都有下划线虚线?_html/css_WEB-ITnose...
  16. 图像处理软件(基本功能都已实现,含源码)
  17. php基于thinkphp、smarty\CodeIgniter构建的开源的淘宝客cms程序下载
  18. net.sf.json.JsonConfig 使用详解
  19. 产品经理-关于APP意见反馈计划
  20. 学前端报面授,还是慕课网或者丁鹿学堂?

热门文章

  1. 山东工商学院计算机科学与技术排名,鲁东大学和山东工商学院计算机专业哪个好...
  2. while it seems to fit format ‘yyyy-MM-dd‘T‘HH:mm:ss.SSSZ‘, parsing fails (leniency? null))
  3. 计算机函数测试结果误差表IF,excel评语公式及格
  4. PC/SC标准读卡器,SCardConnect返回6处理,PCSC API函数写法
  5. 长铗:搭积木无法建筑DeFi摩天楼,Bytom用工程思维构建MOV宇宙
  6. AIoT赋能保险业新发展
  7. 【模拟集成电路】环路滤波器(LPF)设计
  8. 录制宏,理解编程的方法
  9. 【Node.js】 npm与包
  10. Educational Codeforces Round 141 (Rated for Div. 2) 赛时口胡思路(青大acmer训练日常)小上一波分