1 2 3 4 5 下一页 九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置,下图(图一)为问题的一个状态:
 图一、九宫排字问题的一个状态
九宫排字问题不是任何情况下都是有解的,我们可以把一个状态,自左至右,自上而下地用一维数组表示成(a1,a2,a3,a4,a5,a6,a7,a8)(空格跳过),而相应的位置也按同样的顺序排列,那么,如果在位置iaj,则说存在一个逆序,若逆序总数为偶数,则称相应的状态为偶状态,逆序总数为奇数,则称相应的状态为奇状态。
很明显,空格横向移动时,逆序总数无变化,而空格纵向移动时,逆序总数改变-2、0或2,因此,在任何情况下,奇状态和偶状态不可能相互转换。
九宫排字问题的求解方法,就是从初始状态出发,不断地空格上下左右的数码移至空格,将一个状态转化成其它状态,直到产生目标状态。如图二。
本文用C++Builder5.0编写九宫排字问题游戏。游戏规则是,动态产生初始状态,由初始状态出发,不断地空格上下左右的数码移至空格,若能排出目标状态,则成功。
 图二、九宫排字问题的状态图
编程实现:
【第一步】选用C++Builder的菜单项“File|New Application”,创建一个工程。
【第二步】给项目加入九个Panel控件,一个MainMenu控件,两个Label控件,并各控件的安排如图三所示。
 图三、各控件的安排
1 2 3 4 5 下一页 |