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

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

作者:赵宏伟

下载源代码

一、题目说明:

(九宫问题)在一个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{public:	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);

相关文章

俯卧撑标准方法

日常的生活当中,我们都是需要锻炼,无论是男性或者是女性健身是可以去除身体当中的肥肉,还可以锻炼我们的灵活性以及抵抗力,对于我们来说有着非常好的作用,不过呢,健身一定要选择正确的方法,就比如说接下来的文...
资料大全2014-05-01
俯卧撑标准方法

高中信息技术教学计划

本册教材的特点: 为了迎接信息时代的挑战,适应信息化社会的要求,我国高中信息技术课程改革正在轰轰烈烈的开展,新的高中信息技术课程标准也已经出台。在这种情况下,以往的初中信息技术教材已不能适应时代对学生...
资料大全2012-07-08
高中信息技术教学计划

安乐死辩论赛全文

1、立论陈述阶段;下面请正方一辩开篇立论,4分钟;正方一辩:;丁灿:在法律不断健全的当今社会,人的权利不断受到;首先就让我们来明确一下安乐死的定义;...
资料大全2013-05-01
安乐死辩论赛全文

课程顾问是做什么的

课程顾问就是课程销售人员,向咨询客户提供专业的课程体系讲解,根据客户需求制定个性化,专业化的学习课程,最终达成课程销售。根据学员的实际情况合理安排课程,达到学员预期学习目标。学习顾问通过面对面及电话每...
资料大全2016-01-01
课程顾问是做什么的

百事可乐猴年广告词

广告的标题是广告正文的高度概括,它所概括的广告主体和信息必须鲜明集中,人们看到它就能理解广告主要宣传的是什么,百事可乐猴年广告词。一条广告语可以选择不同诉求点,即强调的东西不同,但总要突出某一方面。下...
资料大全2017-05-02
百事可乐猴年广告词

代理授权书

在学习、工作、生活中,处理事务上我们需要用到授权书,委托的权限范围,是代理人实施代理行为有效的依据,律师代书时一定要写明确。那要怎么写好授权书呢?以下是小编收集整理的代理授权书范本(通用5篇),欢迎阅...
资料大全2018-02-08
代理授权书