📄 canvasframe.cpp.bak
字号:
// canvasFrame.cpp : implementation file
//
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int MapState[9] = {0};
bool success = false;
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
#define MAX_NUM 9
#define NULL 0
/*错误码定义*/
#define NO_ERROR 0
#define MALLOC_ERROR 1
#define QUEEU_EMPTY 2
#define NO_ANSWER 3
#define SRCSTATE_DSTSTATE_SAME 4
#define STACK_EMPTY 5
/*定义四个枚举值表示四个方向*/
typedef enum
{
GO_RIGHT = 1,
GO_DOWN,
GO_LEFT,
GO_UP
};
typedef struct GridExist
{
int State[MAX_NUM];
GridExist *next;
GridExist *parent;
}NineGridExist;
typedef struct Grid
{
int State[MAX_NUM];
Grid *next;
}NineGrid;
NineGridExist *GridExistHead = NULL;
NineGrid *GridQueueHead = NULL;
NineGrid *GridQueueTail = NULL;
NineGrid *GridStackHead = NULL;
NineGrid *GridStack = NULL;
int DstState[MAX_NUM] = {1,2,3,4,5,6,7,8,0};
int SrcState[MAX_NUM] = {1,0,3,5,7,6,4,8,2};
int EnStack(int State[])
{
NineGrid *p = NULL;
int i = 0;
if (NULL == GridStackHead)
{
GridStack = (NineGrid *)malloc(sizeof(NineGrid));
if (NULL == GridStack)
{
return MALLOC_ERROR;
}
GridStackHead = GridStack;
for (i = 0; i < MAX_NUM; i++)
{
GridStack->State[i] = State[i];
}
GridStack->next = NULL;
}
else
{
p = (NineGrid *)malloc(sizeof(NineGrid));
if (NULL == p)
{
return MALLOC_ERROR;
}
for (i = 0; i < MAX_NUM; i++)
{
p->State[i] = State[i];
}
GridStack->next = p;
GridStack = p;
GridStack->next = NULL;
}
return NO_ERROR;
}
int DelStack(int State[])
{
NineGrid *p = NULL;
NineGrid *q = NULL;
int i = 0;
if (NULL == GridStackHead )
{
return STACK_EMPTY;
}
else
{
if (NULL == GridStackHead->next)
{
for (i = 0; i < MAX_NUM; i++)
{
State[i] = GridStackHead->State[i];
}
GridStackHead = NULL;
}
else
{
q = GridStack;
for (i = 0; i < MAX_NUM; i++)
{
State[i] = GridStack->State[i];
}
for (p = GridStackHead; p->next != GridStack; p = p->next);
GridStack = p;
GridStack->next = NULL;
free(q);
}
}
return NO_ERROR;
}
bool IfStackEmpty()
{
if (NULL == GridStackHead)
{
return true;
}
else
{
return false;
}
}
int EnQueue(int State[])
{
NineGrid *p = NULL;
int i = 0;
if (NULL == GridQueueHead)
{
GridQueueHead = (NineGrid *)malloc(sizeof(NineGrid));
if (NULL == GridQueueHead)
{
return MALLOC_ERROR;
}
GridQueueTail = GridQueueHead;
for (i = 0; i < MAX_NUM; i++)
{
GridQueueHead->State[i] = State[i];
}
GridQueueHead->next = NULL;
}
else
{
p = (NineGrid *)malloc(sizeof(NineGrid));
if (NULL == p)
{
return MALLOC_ERROR;
}
GridQueueTail->next = p;
for (i = 0; i < MAX_NUM; i++)
{
p->State[i] = State[i];
}
GridQueueTail = p;
p->next = NULL;
}
return NO_ERROR;
}
bool IsQueueEmpty()
{
if ((NULL == GridQueueHead) && (NULL == GridQueueTail))
{
return true;
}
else
{
return false;
}
}
int DelQueue(int State[])
{
NineGrid *p = NULL;
if (!IsQueueEmpty())
{
p = GridQueueHead;
for (int i = 0; i < MAX_NUM; i++)
{
State[i] = p->State[i];
}
GridQueueHead = p->next;
free(p);
return NO_ERROR;
}
else
{
return QUEEU_EMPTY;
}
}
int SaveExist(int State[],int NextState[])
{
NineGridExist *p = NULL;
NineGridExist *q = NULL;
NineGridExist *r = NULL;
NineGridExist *parent = NULL;
int i = 0;
if (NULL == GridExistHead)
{
GridExistHead = (NineGridExist *)malloc(sizeof(NineGridExist));
if (NULL == GridExistHead)
{
return MALLOC_ERROR;
}
GridExistHead->next = NULL;
GridExistHead->parent = NULL;
for (i = 0; i < MAX_NUM; i++)
{
GridExistHead->State[i] = NextState[i];
}
}
else
{
p = (NineGridExist *)malloc(sizeof(NineGridExist));
if (NULL == p)
{
return MALLOC_ERROR;
}
for (q = GridExistHead; q ->next != NULL; q = q->next);
q->next = p;
for (i = 0; i < MAX_NUM; i++)
{
p->State[i] = NextState[i];
}
for (r = GridExistHead; r != NULL; r = r->next)
{
for (i = 0; i < MAX_NUM; i++)
{
if (r->State[i] != State[i])
{
break;
}
}
if (MAX_NUM == i)
{
parent = r;
break;
}
}
p->parent = parent;
p->next = NULL;
}
return NO_ERROR;
}
bool CheckIfExist(int State[])
{
NineGridExist *p;
for (p = GridExistHead; p != NULL; p = p->next)
{
for (int i = 0; i < MAX_NUM; i++)
{
if (p->State[i] != State[i])
{
break;
}
}
if (MAX_NUM == i)
{
return true;
}
}
return false;
}
bool CanPass(int State[],int direction,int NextState[])
{
int MapState[3][3] = { 0 };
int s = 0;
int i = 0;
int j = 0;
int temp = 0;
bool IfCanGo = false;
/*将一维数字转化为二维数组*/
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
MapState[i][j] = State[s];
s++;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (0 == MapState[i][j])
{
switch(direction)
{
case GO_RIGHT:
if (j < 2)
{
temp = MapState[i][j];
MapState[i][j] = MapState[i][j + 1];
MapState[i][j + 1] = temp;
IfCanGo = true;
}
else
{
return false;
}
break;
case GO_DOWN:
if (i < 2)
{
temp = MapState[i][j];
MapState[i][j] = MapState[i + 1][j];
MapState[i + 1][j] = temp;
IfCanGo = true;
}
else
{
return false;
}
break;
case GO_LEFT:
if (j > 0)
{
temp = MapState[i][j];
MapState[i][j] = MapState[i][j - 1];
MapState[i][j - 1] = temp;
IfCanGo = true;
}
else
{
return false;
}
break;
case GO_UP:
if (i > 0)
{
temp = MapState[i][j];
MapState[i][j] = MapState[i - 1][j];
MapState[i - 1][j] = temp;
IfCanGo = true;
}
else
{
return false;
}
break;
}
}
if (true == IfCanGo)
{
break;
}
}
}
if (!CheckIfExist(MapState[0]))
{
s = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
NextState[s] = MapState[i][j];
s++;
}
}
return true;
}
else
{
return false;
}
}
bool SuccessReach(int SrcState[],int DstState[])
{
for (int i = 0; i < MAX_NUM; i++)
{
if (SrcState[i] != DstState[i])
{
return false;
}
}
return true;
}
int PrintRoute(int SrcState[],int DstState[])
{
NineGridExist *p = NULL;
NineGridExist *q = NULL;
int s = 0;
int num = 0;
int Step = 0;
int Result = 0;
int State[MAX_NUM] = {0};
for (p = GridExistHead; p != NULL; p = p->next)
{
for (int i = 0; i < MAX_NUM; i++)
{
if (p->State[i] != DstState[i])
{
break;
}
}
if (MAX_NUM == i)
{
break;
}
}
for (q = p; q != NULL; q = q->parent)
{
Result = EnStack(q->State);
if (Result != NO_ERROR)
{
return Result;
}
}
#if 0
while (!IfStackEmpty())
{
Result = DelStack(MapState);
if (Result != NO_ERROR)
{
return Result;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
mdc->SelectObject( bitmap[MapState[s]] );
s++;
dc.BitBlt(j*100,i*100,100,100,mdc,0,0,SRCCOPY);
}
}
Sleep(1000);
}
#endif
return NO_ERROR;
}
int Route(int SrcState[],int DstState[])
{
int State[MAX_NUM] = { 0 };
int Nextstate[MAX_NUM] = { 0 };
int Result = 0;
Result = EnQueue(SrcState);
if (Result != NO_ERROR)
{
return Result;
}
Result = SaveExist(Nextstate,SrcState);
if (Result != NO_ERROR)
{
return Result;
}
if (SuccessReach(Nextstate,DstState))
{
return SRCSTATE_DSTSTATE_SAME;
}
while (!IsQueueEmpty())
{
Result = DelQueue(State);
if (Result != NO_ERROR)
{
return Result;
}
for (int direction = 1; direction <= 4; direction++)
{
if (CanPass(State,direction,Nextstate))
{
Result = SaveExist(State,Nextstate);
if (Result != NO_ERROR)
{
return Result;
}
Result = EnQueue(Nextstate);
if (Result != NO_ERROR)
{
return Result;
}
if (SuccessReach(Nextstate,DstState))
{
success = true;
Result = PrintRoute(SrcState,DstState);
if (Result != NO_ERROR)
{
return Result;
}
else
{
return NO_ERROR;
}
}
}
}
}
return NO_ANSWER;
}
int picnum=0;
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
canvasFrame::canvasFrame()
{
RECT rect;
Create(NULL,"自动拼图程序",WS_OVERLAPPEDWINDOW,CRect(0,0,650,400));
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
mdc = new CDC ;
mdc->CreateCompatibleDC( &dc ); //建立与操作窗口兼容的 DC
char ch[10];
int Result = 0;
for(int i=0;i<=8;i++)
{
sprintf( ch , "%d.bmp" , i ); //取得图文件文件名字符串
bitmap[i] = new CBitmap ; //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -