九宫问题(八数码)求解过程动态演示 -电脑资料

九宫问题(八数码)求解过程动态演示

作者:赵宏伟

下载源代码

一、题目说明:

(九宫问题)在一个3×3的九宫中有1-8这8个数及一个空格随机的摆放在其中的格子里,如图1-1所示,

九宫问题(八数码)求解过程动态演示

。现在要求实现这个问题:将该九宫格调整为如图1-1右图所示的形式。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中。试编程实现这一问题的求解。

(图1-1)

二、题目分析:

九宫问题是人工智能中的经典难题之一,问题是在3×3方格棋盘中,放8格数,剩下的没有放到的为空,每次移动只能是和相邻的空格交换数。程序自动产生问题的初始状态,通过一系列交换动作将其转换成目标排列(如下图1-2到图1-3的转换)。

(图1-2)(图1-3)

九宫问题中,程序产生的随机排列转换成目标共有两种可能,而且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把一个随机排列的数组从左到右从上到下用一个一维数组表示,如上图1-2我们就可以表示成{8,7,1,5,2,6,3,4,0}其中0代表空格。

在这个数组中我们首先计算它能够重排列出来的结果,公式就是:

∑(F(X))=Y,其中F(X)

就是一个数他前面比这个数小的数的个数,Y为奇数和偶数个有一种解法。那么上面的数组我们就可以解出它的结果。

F(8)=0;F(7)=0;F(1)=0;F(5)=1;F(2)=1;F(6)=3;F(3)=2;F(4)=3;Y=0+0+0+1+1+3+2+3=10

Y=10是偶数,所以他的重排列就是如图1-3的结果,如果加起来的结果是奇数重排的结果就是如图1-1最右边的排法。

三、算法分析

九宫问题的求解方法就是交换空格(0)位置,直至到达目标位置为止。图形表示就是:

(图3-1)

要想得到最优的就需要使用广度优先搜索,九宫的所以排列有9!种,也就是362880种排法,数据量是非常大的,我使用的广度搜索,需要记住每一个结点的排列形式,要是用数组记录的话会占用很多的内存,我们把数据进行适当的压缩,

电脑资料

《九宫问题(八数码)求解过程动态演示》()。使用DWORD形式保存,压缩形式是每个数字用3位表示,这样就是3×9=27个字节,由于8的二进制表示形式1000,不能用3位表示,我使用了一个小技巧就是将8表示位000,然后用多出来的5个字表示8所在的位置,就可以用DWORD表示了。用移位和或操作将数据逐个移入,比乘法速度要快点。定义了几个结果来存储遍历到了结果和搜索完成后保存最优路径。

类结构如下:

class CNineGird{p

ublic: struct PlaceList { DWORD Place; PlaceList* Left; PlaceList* Right; }; struct Scanbuf { DWORD Place; int ScanID; }; struct PathList { unsigned char Path[9]; };private: PlaceList *m_pPlaceList; Scanbuf *m_pScanbuf; RECT m_rResetButton; RECT m_rAutoButton;public: int m_iPathsize; clock_t m_iTime; UINT m_iStepCount; unsigned char m_iTargetChess[9]; unsigned char m_iChess[9]; HWND m_hClientWin; PathList *m_pPathList; bool m_bAutoRun;private: inline bool AddTree(DWORD place , PlaceList*& parent); void FreeTree(PlaceList*& parent); inline void ArrayToDword(unsigned char *array , DWORD & data); inline void DwordToArray(DWORD data , unsigned char *array); inline bool MoveChess(unsigned char *array , int way); bool EstimateUncoil(unsigned char *array); void GetPath(UINT depth); public: void MoveChess(int way); bool ComputeFeel(); void ActiveShaw(HWND hView); void DrawGird(HDC hDC , RECT clientrect);

相关文章

牛蒡大骨汤的做法

很多人在炖大骨汤的时候都是会选择一些很普通的食材,这样大骨汤虽然说营养价值很高,但是食材也是普普通通的,如果这个时候我们选择牛蒡来炖这个大骨汤的话,那么所得到的营养价值高不说,这个牛蒡对我们身体来说有...
资料大全2016-08-06
牛蒡大骨汤的做法

七月十五鬼节吃什么

鬼节,顾名思义,与鬼有关的节日、祭祀鬼的节日。鬼是在人类蒙昧时期,对生命的一种延伸。东西方文化对于生命延伸的概念略有不同,但人死为鬼一直是鬼文化的主流。下面是小编整理的七月十五鬼节吃什么,欢迎大家分享...
资料大全2017-01-02
七月十五鬼节吃什么

从古至今对丈夫称谓的变化 -资料

  从古至今,妻子对丈夫的称谓变化就不小,从古至今对丈夫称谓的变化。每个年代的称谓,可看出各个年代的人文环境特色。这些称谓中,有叫“良人”的,有叫“官人”的,有叫“相公”的,有叫“孩子他爹”的,如今还...
资料大全2019-07-06
从古至今对丈夫称谓的变化 -资料

荆轲刺秦王一词多义整理归纳

【还】1、壮士一去兮不复还(动词,回来)──《荆轲刺秦王》2、秦王还柱而走(动词,通环,绕)──《荆轲刺秦王》3、居十白,扁鹊望桓挨还走(动词,通旋,掉转身)──《扁鹊见蔡桓公》4、计日以还(动词,归...
资料大全2011-09-05
荆轲刺秦王一词多义整理归纳

药品营销方案

为了确保事情或工作科学有序进行,通常会被要求事先制定方案,方案是有很强可操作性的书面计划。那么问题来了,方案应该怎么写?以下是小编精心整理的药品营销方案(通用7篇),希望能够帮助到大家。药品营销方案1...
资料大全2013-03-05
药品营销方案

学习计划书

时间就如同白驹过隙般的流逝,我们的学习目标和学习任务同时也不断变化,我们要好好计划今后的学习,制定一份学习计划了。好的学习计划是什么样的呢?以下是小编精心整理的学习计划书,希望对大家有所帮助。  学习...
资料大全2015-02-02
学习计划书