实验报告(华容道)
华容道

“华容道”小课题研究小结高靖淞一、课题名称:华容道二、参加人:高靖淞、夏子晴、况文洋、黄承天、李欣怡、顾维欣、周瑜玲、曾俊威等三、指导老师:秦老师四、基本情况:华容道游戏取自著名的三国故事,曹操在赤壁大战中被刘备和孙权的“苦肉计”、“铁索连舟”、“火烧赤壁”打败。
曹操被迫退逃到华容道,又遇上诸葛亮的伏兵。
关羽为了报答曹操对他的恩情,明逼实让,终于帮助曹操逃出了华容道。
游戏就是依照“曹操兵败走华容,正与关公狭路逢。
只为当初恩义重,放开金锁走蛟龙”这一故事情节设计的。
老师给我们讲:华容道是中国人发明的,最终解法是美国人用计算机求出的。
但华容道的设计原理到现在还没有搞清。
五、研究小结:在秦老师的指导下,我们研究小组经过了一学期的研究,收获很多。
我们通过查资料,了解到最早系统研究游戏华容道的是苏州大学数学教授许莼舫先生。
1952年,他在《数学漫谈》中对这个游戏作了详细的分析,总结出8条规则。
这8条可以归纳为以下4点:1.四个小兵必须两两在一起,不要分开;2.曹操、关羽、大将移动时前面应有两个小兵开路;3.曹操移动时后面还应有两个小兵追赶;4.以上三种状况,其中各块都可局部(不妨碍其他地方)任意移动。
资料显示:历经中外科学家姜长英、藤村幸三郎、清水达雄、马丁加达纳等几十年的努力,游戏解法已由六十多年前的87步减少至81步。
美国一个律师托马斯.莱曼发现一个新的解法,由加德纳公布在1964年3月《科学美国人》上,有81步,称加德纳解法。
华容道的最快走法在中国是100步,在日本是82步。
后来美国人用计算机,使用穷举法找出了最终解法,不可能有再快的解法了,81步。
华容道这个游戏虽然我还不会解,但是在小课题研究过程中,我了解了一些三国时期的历史,收获很多,这也算是“有心栽花花不活,无意插柳柳成荫”吧。
华容道游戏的解法

华容道游戏的解法最早系统研究游戏华容道的是苏州大学数学教授许莼舫先生。
1952年,他在《数学漫谈》中对这个游戏作了详细的分析,总结出8条规则。
这8条可以归纳为以下4点:1,四个小兵必须两两在一起,不要分开;2,曹操,关羽,大将移动时前面应有两个小兵开路;3,曹操移动时后面还应有两个小兵追赶;4,以下三种状况,其中各块都可局部(不妨碍其他地方)任意移动。
在此基础上,许莼舫提出了100步解法。
后来,美国一个律师托马斯.莱曼(Thomas B.Lenann)发现一个新的解法,由加德纳公布在1964年3月《科学美国人》上,有81步,称加德纳解法。
游戏华容道有不同的开局,根据5个矩形块的放法分类,除了5个都竖放是步可能的以外,有一横式,二横式,三横式,四横式,五横式。
下面举几个例子。
研究华容道游戏,除了其历史外,至少有以下几个问题:1,有多少种开局;2,判断有解;3,给出最优解;4,计算机求解。
因此,华容道是个数学游戏。
国内国外都有一些华容道的爱好者研究者。
姜长英先生1985年发起组织“华容道研究会”,他们有了不少结果。
特别是原北京工业学院副院长齐尧的网络研究,可以说完全解决了华容道游戏方法。
他研究了一横式华容道的各种关键状态共54图,找出其间关系,画出关系图。
于是任何一横式华容道都可以经少数几步到达某一个关键状态,其解法也就给出了。
对二横式,三横式,四横式,他也都画出了关系图。
用计算机解决华容道游戏,/html/sxjm/examples/ex5.htm上有这样的说法:“笔者编制的软件HRDE的贡献是成功地实现了一种系统搜索(Systematic searching)算法,它能在较短时间内,对用户摆放的任何一种布局判断是否有解。
如果有解,则解出它的最少步法。
然后,它会在屏幕上用动画方式移动棋子以显示它的运算方法。
也可以用一连串的图形来静止地显示每一步的走法,便于用户仔细地观察研究。
一般情况下,在已经很普及的IBM486计算机上解一道题仅需要一两分钟,在较慢的286计算机上则大约需要十几分钟。
幼儿园华容道活动教案及反思

幼儿园华容道活动教案及反思教案标题:幼儿园华容道活动教案及反思教案目标:1. 培养幼儿的观察力、思维能力和解决问题的能力。
2. 提高幼儿的合作意识和团队合作能力。
3. 培养幼儿的耐心和毅力。
教学内容:1. 游戏介绍:向幼儿简单介绍华容道游戏的规则和目标。
2. 游戏准备:准备一套华容道拼图,确保每个幼儿都有机会参与。
3. 游戏过程:a. 分组:将幼儿分成小组,每组2-3人。
b. 拼图任务:给每个小组分发一套华容道拼图,要求小组合作完成拼图。
c. 时间限制:设定一定的时间限制,鼓励小组尽快完成任务。
d. 比赛评选:根据完成拼图的时间和准确性评选出胜利小组。
教学步骤:1. 游戏介绍:向幼儿简单介绍华容道游戏的规则和目标,让他们了解游戏的挑战性和乐趣。
2. 分组组织:将幼儿分成小组,确保每个小组都有一定的合作性质,避免有些小组中只有一个幼儿。
3. 游戏准备:将华容道拼图分发给每个小组,确保每个幼儿都能参与其中。
4. 游戏指导:向幼儿解释华容道拼图的规则,鼓励他们思考如何移动拼图块以完成整个图案。
5. 游戏实施:让小组开始合作进行拼图任务,并设定一定的时间限制。
6. 游戏结束:时间到后,停止游戏,评选出胜利小组,并对他们进行表扬和鼓励。
教学反思:1. 教学目标达成情况:检查幼儿是否能够理解和遵守游戏规则,是否能够合作完成拼图任务。
2. 教学方法评估:评估所采用的游戏方式是否能够激发幼儿的兴趣和参与度,是否能够培养他们的合作意识和团队合作能力。
3. 教学时间安排:评估所设定的时间限制是否合理,是否给予幼儿足够的时间来完成任务。
4. 教学资源准备:检查所准备的华容道拼图是否足够,是否能够满足每个小组的需求。
5. 教学效果评估:观察幼儿在游戏过程中的表现,是否能够培养他们的观察力、思维能力和解决问题的能力。
通过这个教案,希望能够帮助幼儿园教师在幼儿园华容道活动中提供专业的教案建议和指导,以促进幼儿的全面发展。
“华容道”游戏解法的研究与实现

摘 要 :“华容 道 ”是 中 国 古代 传 统 单人 玩 的拼 板 类 游 戏 。虽然 以 前 多次 见 到报 刊 、网络 有具 体 解 法 的 报 道 ,但 未见 到 有 对 此 游戏 全 面 的分 析 和 通 用局 的 计 算 机 解 法 的描 述 。为此 ,作 者采 用改 进 的 非 递 归 深 度优 先 算 法对 《华 容道 》通 用局 的 解 法进 行 了全 面 的 分析 和论 证 。 随后 通 过 编 程 实现 了这一 通 用解 法 .并 通 过 对 当前 常 见 的 几十 个布 局 进 行 了测 试 ,从 而 验 证 了分析 结论 及 其 有 效 性 。 关 键 词 :华 容 道 ;深 度 优 先 算 法 ;电脑 游 戏 文 章 编 号 :1002—8331(2007)13—0108—03 文献 标 识 码 :A 中 图分 类号 :TP31 1
该 游戏 属 于 单 人 玩 的拼 板 类 游 戏 。 如 图 1所 示 .棋 盘 是 由 4x5的矩 形 区域构 成 .棋 子共 4种类 型 10块 拼 板 :2x2的矩 形 板 一 个 (曹 操 )、1×1的 矩 形 板 4个 (兵 ),2xl和 1×2的 矩 形 拼 板 共 有 5个 (关 张 赵 马黄 五 将 )。这 4种 棋 子 每 个 单 位 的 大小 与棋 盘 的单 位 大小 完 全 一 样 .只 能 与 空格 “交 换 ”位 置 完 成 棋 子 的移 动 .棋 子 在 移 动 的过 程 中不 能 超 出 棋盘 范 同 .也 不能 出现 重 叠 。
幼儿园智慧拼图:益智游戏华容道教案分享

幼儿园智慧拼图:益智游戏华容道教案共享一、引言在幼儿园教育中,益智游戏一直是非常重要的一部分。
这些游戏不仅可以帮助孩子发展认知能力和动手能力,还可以培养他们的耐心和逻辑思维能力。
其中,华容道是一种非常经典的益智游戏,它激发了孩子们的想象力和解决问题的能力。
在本文中,我们将共享一些幼儿园华容道教案,帮助老师们更好地引导孩子们进行益智游戏,并开发他们的智慧。
二、认识华容道华容道是一种源自我国的传统益智游戏,它由若干小木块组成,每个小木块上都有不同的图案或数字。
游戏的目标是将这些小木块移动,最终使得特定的一块小木块能够从游戏面板的出口处走出来。
这个游戏看似简单,实际上需要玩家进行精确的推理和移动,是一种非常考验智力的游戏。
三、华容道教案共享1. 游戏名称:《拼图华容道》教学目标:培养幼儿的观察力、耐心和逻辑推理能力。
教学内容:- 向幼儿介绍华容道的基本规则和玩法。
- 给幼儿准备一些简单的华容道游戏,让他们尝试使用小木块进行移动。
- 鼓励幼儿进行观察和思考,引导他们找到解决问题的方法。
- 组织幼儿进行小组竞赛,看谁能够最快完成华容道的拼图。
活动评价:通过这个教案,幼儿们在玩游戏的过程中锻炼了自己的思维能力和动手能力,培养了他们的耐心和团队合作精神。
2. 游戏名称:《华容道拼图比赛》教学目标:让幼儿在竞赛中感受到益智游戏的乐趣,培养他们的团队合作意识。
教学内容:- 组织幼儿分成若干小组,准备多个华容道游戏。
- 每个小组派出一名代表,比赛看谁能最快完成游戏。
- 赛后进行总结,共享各组在游戏中的经验和感悟。
- 鼓励幼儿表达对华容道游戏的喜爱之情,共享他们的心得体会。
活动评价:这个教案不仅锻炼了幼儿的团队合作精神,还让他们在比赛中体会到了益智游戏的乐趣,增强了他们对游戏的热爱。
四、个人观点和理解华容道是一种非常经典的益智游戏,它不仅能够锻炼孩子们的逻辑思维和观察力,还能够培养他们的耐心和团队合作精神。
在幼儿园教育中,华容道是一种非常适合的益智游戏,可以帮助孩子们在玩游戏的提升自己的综合能力。
华容道的游戏方案幼儿包括总结和反思

华容道的游戏方案幼儿包括总结和反思通过《华容道》游戏的教学,我发觉孩子的潜能是巨大的,如此复杂的游戏拼摆过程,学生兴趣盎然,拼摆时不达目的不罢休,由此可以看出我们的孩子都是聪明的、善于钻研的,只有努力上好益智游戏课,让孩子们能在一个平等、民主、轻松、和谐的氛围下,进行自主性、探究性、创造性学习。
纵观本次教学,学生变化主要归结为以下几点:
1.培养了学生的逻辑思维能力。
游戏中要想释放曹操,要求孩子们有较强的逻辑思维能力,每走一步都要进行思考,否则将面临无解的可能。
2.磨练了学生的意志力。
这个游戏复杂多变,对于初玩的孩子来说是一个巨大的挑战,因此要想通关必然要付出百倍的精力。
3、培养了学生的创新意识。
活动中学生体验到游戏带来的无穷
乐趣,他们在尝试、感悟的过程中都有所体会,并能充分大胆地表露自己的想法。
课堂上我深切地感受到教师要敏锐地把握住课堂中出现的每个
课程资源,及时有效地调整教学,这对我这个刚刚接触益智游戏课的教师来讲是个挑战,本节课在引导孩子玩这款游戏的过程中,也有地方没有及时抓住,在今后的教学中要善于扑捉课堂上随时生成的问题,及时解决,从而不断完善自己的教学。
华容道游戏的设计与实现
华容道游戏的设计与实现华容道游戏是一种以挪动木块为主要玩法的益智游戏,其目标是通过挪动木块使特定的木块脱离逆境,达到特定的布局。
是一个涉及逻辑、算法和用户体验的综合性任务。
本文将介绍华容道游戏的设计思路和实现过程。
1. 游戏设计思路华容道游戏的设计需思量以下方面:游戏规则、游戏难度、游戏界面、游戏操作和游戏反馈。
游戏规则是华容道游戏的基础,核心规则是挪动木块,使目标木块脱困。
但为了增加游戏趣味性,可以加入其他限制条件,如限定步数、限定时间、增加路径障碍等。
游戏难度是游戏设计中的一个关键点。
难度设计要思量玩家的不同水平宁游戏体验。
最好提供多个难度级别供玩家选择,以增加游戏的趣味性和可玩性。
游戏界面直接影响玩家的游戏体验。
设计一个简洁明晰的界面能让玩家更专注于游戏本身。
可以使用明亮的颜色和简易的元素来增加游戏的可视化效果和吸引力。
游戏操作要简易易懂,玩家可以通过轻松的手势进行拖拽或点击操作。
同时,游戏中应该提供操作提示和援助,以指导玩家正确完成游戏。
游戏反馈是游戏设计中屡屡被轻忽的一方面。
为了增强玩家的参与感和成就感,游戏需要提供准时的反馈,如显示完成进度、提示下一步操作或者嘉奖玩家等。
2. 游戏实现过程华容道游戏的实现需要涉及到算法、数据结构和程序设计等多个方面。
下面将以一个简易的4x4方格的华容道游戏为例,介绍游戏的实现过程。
起首,需要设计一个数据结构来表示游戏中的木块和游戏状态。
可以使用一个二维数组来表示方格,并用数字或字符表示不同的木块。
例如,0可以表示空位,1-15表示不同编号的木块。
游戏状态可以用一个整数或字符串表示。
接下来,需要实现挪动木块的算法。
挪动算法可以依据玩家的操作来改变游戏状态,从而改变方块的位置。
一种简易的算法是依据交换原则,即依据玩家选择的方向裁定相邻空位与所选方块交换位置。
然后,需要设计一个裁定成功条件的算法。
在华容道游戏中,成功条件是特定的方块达到特定的位置。
可以通过比较当前游戏状态和目标状态来裁定是否成功。
华容道三横两竖解法
华容道三横两竖解法华容道是一种智力游戏,游戏棋盘是一个长方形网格,包含十字形的4个小网格和8个竖条网格,总共有9个方格。
游戏目标是将9个方块按照指定的布局排列好,其中包括8个小方块和一块大方块,大方块标有“曹操”,其他小方块则标有“张飞”、“赵云”、“关羽”、“马超”、“黄忠”、“黄盖”和“典韦”。
华容道可以通过移动方块的方式来求解,每次只能移动一块方块到一个空位置上,而且只能上下左右移动。
玩家需要利用空位来调换方块的位置,以达到最终布局的要求。
据统计,华容道的最佳解法需要至少81步,但可以确保每局都是有解的。
下面我们来介绍一种华容道的解法,该解法以三横两竖的棋盘布局为基础。
首先,让我们来看一下华容道的初始布局和目标布局:初始布局:00 01 0210 11 1220 21 22目标布局:10 11 1220 21 2200 01 02在该布局下,我们的目标是将方块“曹操”移动到左上角,即坐标为(0,0)的位置上。
接下来是解法的具体步骤:步骤一:将方块“黄盖”移动到坐标为(0,1)的位置上,可以通过以下移动完成:00 11 0210 21 1220 -- 22步骤二:将方块“关羽”移动到坐标为(0,2)的位置上,可以通过以下移动完成:00 01 1110 21 1220 -- 22步骤三:将方块“典韦”移动到坐标为(1,2)的位置上,可以通过以下移动完成:00 01 11-- 21 1220 10 22步骤四:将方块“黄忠”移动到坐标为(2,2)的位置上,可以通过以下移动完成:00 01 1121 -- 1220 10 22步骤五:将方块“赵云”移动到坐标为(2,1)的位置上,可以通过以下移动完成:00 01 1121 10 1220 -- 22步骤六:将方块“马超”移动到坐标为(2,0)的位置上,可以通过以下移动完成:00 01 1121 10 12-- 20 22步骤七:将方块“张飞”移动到坐标为(1,0)的位置上,可以通过以下移动完成:00 01 1121 10 1220 -- 22通过以上步骤,我们成功地将方块“曹操”移动到了目标位置(0,0),完成了华容道的解法。
数字华容道,培养孩子逆向思考
数字华容道,培养孩⼦逆向思考
前⼏天突然发现⼀个很好玩的游戏,名字是:数字华容道。
这个可以锻炼孩⼦的观察,逻辑能⼒,培养孩⼦逆向思考解决问题的问题。
数字华容道找到⽬标数字,找到⽬标位置,创造空位来移动,只要分三步⾛,就可以完成了。
第⼀步:先摆好1和2,
⼀个打乱的数字华容道
第⼆步:摆好数字3
通过移动字母,让123排成⼀个反的“L'形,然后像玩吞⾷蛇⼀样让1打洞,使3排到第⼀排的中间位置,然后让3打洞,来到它应该待的地⽅,最后让2,1紧跟其后。
第三步,也是最重要的⼀步,找到⼀组好朋友4.7,把4和7⼀组连起来,排在指定的位⼦,剩下的⼏个数字就可以通知空格移动简单的完成了。
需要注意的是4和7两个数字如果在第三排,就要按47顺序排序,如果4和7两个数字在第⼆排,就要按74的顺序排序,然后通过移动数字就可以完成了。
是不是很好玩?孩⼦最近做完作业就想玩⼀会,有时间⼤家⼀起来动⼿玩玩吧。
华容道活动教案范文
华容道活动教案范文一、活动目标1. 让学生了解华容道游戏的背景和规则,培养学生的逻辑思维能力。
2. 培养学生团队协作能力和解决问题的能力。
3. 通过活动,激发学生对中国传统文化的兴趣。
二、活动准备1. 华容道游戏道具:曹操、关羽、张飞、赵云等角色棋子。
2. 游戏场地布置:将游戏道具摆放在桌子上,形成一个棋盘。
3. 教学PPT:介绍华容道游戏的背景和规则。
三、活动过程1. 引入:教师简要介绍华容道游戏的背景,引发学生兴趣。
2. 讲解规则:教师讲解华容道游戏的规则,让学生清楚游戏玩法。
3. 演示教学:教师进行华容道游戏的演示,让学生直观地了解游戏过程。
4. 学生分组:将学生分成若干小组,每组选出一个组长。
5. 游戏开始:各小组进行华容道游戏,争取在最短时间内完成任务。
6. 暂停休息:游戏进行一段时间后,教师组织学生休息,讨论游戏过程中的问题和解决方法。
7. 继续游戏:学生重新开始游戏,争取更好地完成任务。
8. 总结:教师引导学生总结游戏过程中的收获和感悟。
四、活动注意事项1. 确保学生了解华容道游戏的规则,避免在游戏中出现混乱。
2. 注意学生的安全,避免学生在游戏过程中发生碰撞。
3. 鼓励学生积极参与,培养学生的团队协作精神。
4. 教师要关注学生的情绪,适时调整游戏难度,保证游戏的顺利进行。
五、教学反思1. 教师要反思活动的组织过程,是否有序、高效。
2. 反思教学方法,是否适合学生的需求,能否激发学生的兴趣。
3. 关注学生的表现,总结活动在培养学生的逻辑思维、团队协作等方面的效果。
4. 针对活动的不足,提出改进措施,为下一次活动做好准备。
六、活动扩展1. 学生可以自主设计华容道游戏关卡,增加游戏的趣味性和挑战性。
2. 组织华容道比赛,邀请其他班级或学校的学生参加,提高学生的竞争意识。
3. 结合数学学科,引导学生探讨华容道游戏中的排列组合问题,培养学生的数学思维。
七、活动评估1. 观察学生在游戏过程中的表现,评估学生的逻辑思维能力和团队协作能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构(华容道)实验报告实验名称:华容道学生姓名:班级:学号:日期:一、实验目的可以输入华容道游戏的起始布局,求出求解结果。
二、程序分析2.1存储结构链式存储结构2.2程序流程对于此类问题的求解,一般都是通过搜索空间的方法获得可行解法。
这里采用广度优先搜索。
理论上讲,广度优先算法得到的第一个解,一定是一个搜索步数最少的解(如有解存在),这正好是华容道游戏的需要。
广度优先搜索算法一般通过队列存储结构实现。
由当前布局状态判断哪些棋子可以移动,每移动一个棋子,得到一个新的布局状态,若不是最终解且该布局以前没有出现过,则入队。
显然算法在设计细节时需要考虑移动棋子的算法,以及如何判断新的布局状态是否出现过。
2.3关键算法分析算法1:MemoryPool::MemoryPool(unsigned int size){if (size <= 100)throw"size should be greater than 100.";m_Base = new char[size];if (!m_Base)throw"no enough memory.";m_PoolSize = size;m_Frist = NULL;InsertFreeBlock(m_Base, size - 2 * sizeof(BlockBorder));}void MemoryPool::InsertFreeBlock(void *p, int size){FreeBlockHead*s = (FreeBlockHead *)p;s->BlockLength = size;p = (char*)p + size + sizeof(BlockBorder);((BlockBorder*)p)->BlockLength = size;if (m_Frist)m_Frist->prior = s;s->next = m_Frist;s->prior = NULL;m_Frist = s;}void MemoryPool::DeleteFreeBlock(FreeBlockHead *p){if (!p->next && !p->prior){m_Frist = NULL;}else if (!p->next&&p->prior){p->prior->next = NULL;}else if (!p->prior){p->next->prior = NULL;m_Frist = p->next;}else{p->next->prior = p->prior;p->prior->next = p->next;}}void MemoryPool::SetUsedBorder(void *p, int size){((BlockBorder*)p)->BlockLength = -size;p = (char*)p + sizeof(BlockBorder) + size;((BlockBorder*)p)->BlockLength = -size;}void * MemoryPool::Allocate(int size){if (m_Frist == NULL) return NULL;FreeBlockHead *p = m_Frist;while (p&&p->MemorySize() < size)p = p->next;if (!p) return NULL;if (p->MemorySize() <= size + sizeof(FreeBlockHead) + sizeof(BlockBorder)) {DeleteFreeBlock(p);SetUsedBorder(p, p->BlockLength);return (char*)p + sizeof(BlockBorder);}else{int newsize = p->MemorySize() - size - 2 * sizeof(BlockBorder);DeleteFreeBlock(p);InsertFreeBlock(p, newsize);SetUsedBorder((char*)p + p->BlockSize(), size);return (char*)p + p->BlockSize() + sizeof(BlockBorder);}}BlockBorder * MemoryPool::GetCurrentBlock(void *p){return(BlockBorder*)((char*)p - sizeof(BlockBorder));}BlockBorder* MemoryPool::GetPreBlock(void *p){char *cp = (char*)GetCurrentBlock(p);if (cp == m_Base) return NULL;else{int len = *(int *)(cp - sizeof(BlockBorder));cp -= 2 * sizeof(BlockBorder) + (len < 0 ? -len : len);return (BlockBorder*)p;}}BlockBorder * MemoryPool::GetNextBlock(void *p){BlockBorder * bp = GetCurrentBlock(p);char *cp = (char*)bp + bp->BlockSize();return (cp == m_Base + m_PoolSize) ? NULL : (BlockBorder*)cp;}void MemoryPool::Free(void *p){BlockBorder * currentBlock = GetCurrentBlock(p);BlockBorder * nextBlock = GetNextBlock(p);if (nextBlock&&nextBlock->Free()){int size = nextBlock->BlockSize();DeleteFreeBlock((FreeBlockHead*)nextBlock);InsertFreeBlock(currentBlock, currentBlock->MemorySize() + size);}BlockBorder * preBlock = GetPreBlock(p);if (preBlock&&preBlock->Free()){DeleteFreeBlock((FreeBlockHead*)preBlock);InsertFreeBlock(preBlock, preBlock->MemorySize() + currentBlock->BlockSize());}else{InsertFreeBlock(currentBlock, currentBlock->MemorySize());}}MemoryPool::~MemoryPool(){cout << m_Frist << endl;cout <<"size:"<< m_Frist->MemorySize() << endl;if (m_Base)delete[]m_Base;}[1]算法功能(1)每个状态布局的结构定义struct G{char grid[5][4];//当前状态的布局char father[5][4];//到达当前状态的前一个状态布局};bool operator < (const G&a, const G&b){return memcmp(a.grid[0], b.grid[0], 20) < 0;}(2)棋子移动考虑到一些棋子一次可能有两种移动方式,设计MOVE函数返回移动方式的数目,参数NEWG指针指向为移动后的状态数组,每个元素为一种移动后的布局。
int Move(G&g, int i, int j, G* newg){if (g.grid[i][j] == '0')return 0;if ((g.grid[i][j] == 'C' || g.grid[i][j] == 'H') && i != 0 && g.grid[i - 1][j] == 'B'&&g.grid[i - 1][j + 1] == 'B'){GetNextG(&newg[0], &g, sizeof(G));int h = 1;if (g.grid[i][j] == 'C')h = 2;Slide(newg[0].grid, g.grid, i, j, -1, 0, h, 2);return 1;}if (g.grid[i][j] == 'C'&&i < 3 && g.grid[i + 2][j] == 'B'&&g.grid[i + 2][j + 1] == 'B' || g.grid[i][j] == 'H'&&i < 4 && g.grid[i + 1][j] == 'B'&&g.grid[i + 1][j + 1] == 'B') {GetNextG(&newg[0], &g, sizeof(G));int h = 1;if (g.grid[i][j] == 'C')h = 2;Slide(newg[0].grid, g.grid, i, j, 1, 0, h, 2);return 1;}if ((g.grid[i][j] == 'C' || g.grid[i][j] == 'G') && j != 0 && g.grid[i][j - 1] == 'B'&&g.grid[i + 1][j - 1] == 'B'){GetNextG(&newg[0], &g, sizeof(G));int w = 1;if (g.grid[i][j] == 'C')w = 2;Slide(newg[0].grid, g.grid, i, j, 0, -1, 2, w);return 1;}if (g.grid[i][j] == 'C'&&j< 2 && g.grid[i][j + 2] == 'B'&&g.grid[i + 1][j + 2] == 'B' || g.grid[i][j] == 'G'&&j< 3 && g.grid[i][j + 1] == 'B'&&g.grid[i + 1][j + 1] == 'B') {GetNextG(&newg[0], &g, sizeof(G));int w = 1;if (g.grid[i][j] == 'C')w = 2;Slide(newg[0].grid, g.grid, i, j, 0, 1, 2, w);return 1;}if (g.grid[i][j] == 'H'&&j != 0 && g.grid[i][j - 1] == 'B'){GetNextG(&newg[0], &g, sizeof(g));Slide(newg[0].grid, g.grid, i, j, 0, -1, 1, 2);int num = 1;if (j > 1 && g.grid[i][j - 2] == 'B'){GetNextG(&newg[1], &g, sizeof(G));Slide(newg[1].grid, g.grid, i, j, 0, -2, 1, 2);num++;}return num;}//。