15数字华容道解法 图解_三国华容道

411bf74f4aba871d4f9417fb90ae2d05.png

华容道游戏属于滑块类游戏,就是在一定范围内,按照一定条件移动一些滑块,最后满足一定的要求。

滑块类游戏究其起源,最早是中国古代的"重排九宫"。那应该是出现河图洛书的时代,有数千年历史。1865年,西方出现"重排十五"游戏,特别是萨姆·洛伊德在1878年推出"14-15"游戏,风行一时。此后,各种各样的滑块类游戏不断涌现。哈代发明三角旗游戏并在1909年取得专利。再往后,法国出现红鬃烈马游戏。可以猜测,这个游戏传到中国,本土化成为华容道游戏。

华容道游戏取自著名的三国故事,曹操在赤壁大战中被刘备和孙权的"苦肉计"、"铁索连舟"打败,被迫退逃到华容道(地名),又遇上诸葛亮的伏兵,关羽为了报答曹操对他的恩情,明逼实让,终于帮助曹操逃出了华容道。游戏就是依照"曹瞒兵败走华容,正与关公狭路逢。只为当初恩义重,放开金锁走蛟龙"这一故事情节设置的。

054cdc1070d0493967074b4fc0ca47d7.png

三国华容道的游戏规则,是通过滑动各个棋子,帮助曹操从初始位置移到棋盘最下方中部,从出口逃走。整个棋盘只有曹操能出去,其他棋子是出不去的。

华容道是中国人发明的,最终解法却是美国人用计算机求出的。华容道是一个由二十个方格组成的棋盘,有一个四格大小的棋(曹操),五个两格大小的棋(五虎上将),四个一格大小的棋(四个小兵),还有两个空格。但最终的数学原理还是未解之谜。

最早系统研究华容道的是苏州大学数学教授许莼舫先生。1952年,他在《数学漫谈》中对这个游戏作了详细的分析,总结出8条规则。这8条可以归纳为以下4点:

1,四个小兵必须两两在一起,不要分开;

2,曹操,关羽,大将移动时前面应有两个小兵开路;

3,曹操移动时后面还应有两个小兵追赶;

4,以上三种状况,其中各块都可局部(不妨碍其他地方)任意移动。

在此基础上,许莼舫提出了100步解法。

后来美国一个律师托马斯.莱曼(Thomas B.Lenann)用计算机,使用枚举法找出了最少步数的解法,共81步。由加德纳公布在1964年3月《科学美国人》上,称加德纳解法。

今天我就给大家介绍一下81步法:

图解:

0e24ea26b6f7e62db41d1605150c76bd.png

581558a16201ae76421e8e2997d209ab.png

0da657eb8ce16d6c728a867a684cef4f.png

视频:

这次我录了由浅入深三个版本的视频,满足大家不同的需求:

1.只是想大概看看怎么玩,看个开心,看个轻松,看配乐欣赏版:

04bc71ba5ed6b6bda59bc76339ea99ef.png

2.想清晰了解这81步的每一步是怎么走的,看最少步数版:

04bc71ba5ed6b6bda59bc76339ea99ef.png

3.想进一步了解81步法的思路,看思路详解版:

04bc71ba5ed6b6bda59bc76339ea99ef.png

花絮1:配乐欣赏版的音乐选的是《新白娘子传奇》中的《前世今生》,为什么会选这首歌呢?因为前两天去看了电影《白蛇:缘起》,画面非常唯美(可以媲美迪士尼的动画片了,推荐大家去看),片尾的音乐就是这首歌。这两天这首歌一直萦绕在我耳边,练华容道的时候脑中一直是这首歌,发现这首歌的节奏和华容道挺搭的,就想录个配乐欣赏版让大家开心开心57d38ac332150612ad32466bd8135ba6.png

花絮2:这篇文章的首发日期是2019年1月19日,那时候《白蛇:缘起》还在上映,现在应该早已下映了d9cde31dc7982c2767b15653b8034aed.png我为什么要重发一遍呢?还是因为配乐欣赏版d9cde31dc7982c2767b15653b8034aed.png昨天想给配乐欣赏版换个封面,结果不知道怎么搞的,视频被腾讯视频下架了。下架后,大家再翻到这篇文章,就看不到配乐欣赏版的视频了。所以今天我把视频重新上传了一次,结果视频被腾讯视频推荐了。一会儿能下架,一会儿又能推荐,我真是不明白腾讯视频的逻辑d9cde31dc7982c2767b15653b8034aed.png不过上传好了就行,文章的视频链接就得改成新的链接,所以文章也得跟着重发一次。其实前两天的第二条推送也是发过的内容,也是因为需要改动的原因,所以再重发一遍,旧版本我就删掉了。今天一起跟大家解释一下ab47ea561c712828e06478c0d16a4ec9.png

花絮3:虽然配乐欣赏版的时间是三个视频中最短的,但是却是我花最长时间录的,大概录了有100遍,就是为了录出一个没有瑕疵的版本。因为大家能看出来,滑块之间很容易卡。卡本来很正常没什么,但是配上音乐,就不能卡,一卡就跟拍子不协调。哪怕只有一处卡了,就觉得不够流畅,美感就会降低几分,谁让我是一个完美主义者呢,不过录得非常开心,希望大家也看得开心5e64e3aee6cf6560ec2b73af0c6add90.png好不容易录出了完美的版本,希望大家转发朋友圈,让更多的人感受这份愉悦5e64e3aee6cf6560ec2b73af0c6add90.png

5e64e3aee6cf6560ec2b73af0c6add90.png点一下文末的“好看”好不好5e64e3aee6cf6560ec2b73af0c6add90.png

55c72476a0f146b65507c9a643da8b3a.png

55a8c6d1c00e0917cc1989cb5606babb.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。首先,数字华容道是一种经典的益智游戏,需要将九个数字的方块按照规定的移动方式进行排序。在Jupyter Notebook中,我们可以使用Python语言来实现数字华容道。 以下是一个简单的数字华容道实现代码,你可以在Jupyter Notebook中运行它: ```python # 定义一个数字华容道的类 class DigitalPuzzle: # 初始化数字华容道 def __init__(self, nums): self.board = nums # 打印数字华容道的当前状态 def print_board(self): for i in range(3): for j in range(3): print(self.board[i * 3 + j], end=" ") print() print() # 判断数字华容道是否已经完成 def is_solved(self): return self.board == [1, 2, 3, 4, 5, 6, 7, 8, 0] # 获取空格位置 def get_blank_pos(self): return self.board.index(0) # 获得空格周围可以移动的数字 def get_moveable_nums(self): blank_pos = self.get_blank_pos() moveable_nums = [] if blank_pos - 3 >= 0: moveable_nums.append(self.board[blank_pos - 3]) if blank_pos + 3 < 9: moveable_nums.append(self.board[blank_pos + 3]) if blank_pos % 3 != 0: moveable_nums.append(self.board[blank_pos - 1]) if (blank_pos + 1) % 3 != 0: moveable_nums.append(self.board[blank_pos + 1]) return moveable_nums # 移动数字 def move_num(self, num): num_pos = self.board.index(num) blank_pos = self.get_blank_pos() self.board[num_pos], self.board[blank_pos] = self.board[blank_pos], self.board[num_pos] # 解数字华容道 def solve(self): # 如果数字华容道已经完成,直接返回 if self.is_solved(): return # 获取空格周围可以移动的数字 moveable_nums = self.get_moveable_nums() # 移动每一个可以移动的数字,并递归求解 for num in moveable_nums: new_puzzle = DigitalPuzzle(self.board[:]) new_puzzle.move_num(num) new_puzzle.solve() # 如果数字华容道已经完成,打印解法 if new_puzzle.is_solved(): print("Solution Found:") new_puzzle.print_board() return ``` 在上面的代码中,我们定义了一个DigitalPuzzle类来表示数字华容道。该类包含了数字华容道的各种操作方法,如打印当前状态、判断是否已经完成、获取空格位置、获取空格周围可以移动的数字、移动数字等。 最后,我们在solve方法中使用递归来解决数字华容道问题。该方法会移动每一个可以移动的数字,并递归求解,直到找到解法为止。如果数字华容道已经完成,就会打印解法。 你可以通过以下方式创建一个数字华容道对象,并打印当前状态: ```python puzzle = DigitalPuzzle([2, 8, 3, 1, 6, 4, 7, 0, 5]) puzzle.print_board() ``` 这会输出以下结果: ``` 2 8 3 1 6 4 7 0 5 ``` 接下来,你可以使用solve方法解决数字华容道问题: ```python puzzle.solve() ``` 如果存在解法,程序会输出解法的步骤。例如,对于上面的数字华容道,程序会输出以下结果: ``` Solution Found: 1 2 3 4 5 6 7 8 0 ``` 希望能够帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值