当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 九宫问题(八数码)求解过程动态演示
| 九宫问题(八数码)求解过程动态演示 一、题目说明: (九宫问题)在一个3×3的九宫中有1-8这8个数及一个空格随机的摆放在其中的格子里,如图1-1所示。现在要求实现这个问题:将该九宫格调整为如图1-1右图所示的形式。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中。试编程实现这一问题的求解。 (图1-1)
九宫问题中,程序产生的随机排列转换成目标共有两种可能,而且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把一个随机排列的数组从左到右从上到下用一个一维数组表示,如上图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最右边的排法。 (图3-1) 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); |