首页计算机计算机基础数据结构-C#语言描述 10 第10章 八数码问题.pptx

10 第10章 八数码问题.pptx

页数:7页文件大小:363.0 KB来源: 数据结构-C#语言描述ppt课件

本课件以八数码问题作为课程综合实训:先说明 3×3 九宫格上移动棋子从初始状态到目标状态的规则,再引入逆序的概念,用两个具体棋局演示逆序数的计算方法,并给出“逆序奇偶性相同则可相互到达”的判定结论,最后讨论用什么方法与数据结构求解最优解、以及如何用数组表示棋盘状态。

第十章八数码问题封面,引出棋盘规则、有解判定与求解方法三条主线
八数码问题规则页,说明在3乘3九宫格上移动棋子由初始状态变到目标状态
逆序数计算表,列出棋局81567342各数字的F(n)取值并得出逆序为偶数
查看本课件的文字版(共 7 页,供检索与复制)

第1页:第十章八数码问题封面

本页为第十章八数码问题封面。本章作为课程综合实训,讲解八数码问题的规则、有解性判定以及求解最优解的方法与数据结构。

第2页:什么是八数码问题

八数码问题就是在一个 3×3 的九宫格棋盘上,分别将标有数字 1~8 的八个棋子摆放其中,摆放时要求棋子不能重叠。于是,在 3×3 的棋盘上将出现一个空格,允许这个空格周围的某一个棋子向空格移动。

这样通过移动棋子就可以不断改变棋子的布局。假设给定一个初始的棋子布局(初始状态)和一个目标布局(目标状态),要求移动棋子,实现从初始状态到目标状态的转变,给出一个合法的走步序列。

第3页:逆序计算:偶数的棋局

逆序状态:将棋局中的数字从上到下、从左到右进行排序,每个数字前面比它大的数字的个数和称为这个状态的逆序。

函数 F(n) 表示数字 n 前面比它大的数字的个数。对棋局 8、1、5、6、7、3、4、2 逐一计算,结果如下:

棋局 81567342 的逆序计算表
数字 nF(n):前面比它大的数字个数
80
11
51
61
71
34
44
26

各 F(n) 之和为 18,是偶数,因此该棋局的逆序状态为偶数。

第4页:逆序计算:奇数的棋局

逆序状态:将棋局中的数字从上到下、从左到右进行排序,每个数字前面比它大的数字的个数和称为这个状态的逆序。函数 F(n) 表示数字 n 前面比它大的数字的个数。

对棋局 7、6、8、4、2、5、3、1 逐一计算,结果如下:

棋局 76842531 的逆序计算表
数字 nF(n):前面比它大的数字个数
70
61
80
43
24
53
35
17

各 F(n) 之和为 23,是奇数,因此该棋局的逆序状态为奇数。

第5页:是否有解的判定

对比两个棋局的逆序状态:

  • 棋局 8、1、5、6、7、3、4、2 的逆序状态为偶数
  • 棋局 7、6、8、4、2、5、3、1 的逆序状态为奇数

判定规则:若两个状态的逆序奇偶性相同,则可相互到达,否则不可相互到达。因此这两个棋局之间无法相互到达。

第6页:求解最优解的方法

本页讨论使用什么方法求解八数码问题的最优解:把每一种棋子布局看作状态空间中的一个结点,从初始状态出发按空格的移动规则逐层扩展,直到搜索到目标状态为止。

图中给出了初始状态、目标状态以及若干中间状态构成的搜索树,沿起始状态到目标状态的路径即可得到合法的走步序列。

第7页:用数组表示棋盘状态

本页讨论使用什么数据结构表示棋盘状态。下图棋盘状态为 7、6、8、4、2、5、3、1,可用一个长度为 9 的一维数组按从左到右、从上到下的顺序存放各格中的棋子:

棋盘状态的数组表示表
数组下标存放内容
17
26
38
44
5空格
62
75
83
91

用一维数组表示后,每次移动棋子只需交换空格所在位置与目标棋子所在位置的两个元素,便于程序判重与搜索。

顶部目录