?? mainclass.cpp
字號:
// MainClass.cpp: implementation of the CMainClass class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WIN馬踏棋盤.h"
#include "MainClass.h"
#include "iostream.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMainClass::CMainClass()
{
OninitChessBoard();//初始化棋盤
m_record=0;//記錄為空
finded=false;
}
CMainClass::~CMainClass()
{
}
void CMainClass::ShowHorseProcess()
{
//輸出馬踏棋盤的過程
extern int m_ChessBoardSize_x;//棋盤的位置
extern int m_ChessBoardSize_y;
for(int i=1;i<=m_ChessBoardSize_x*m_ChessBoardSize_y;i++)
cout<<"馬的位置<"<<m_RecordPosition[i].m_CurrptrPosition.m_x<<","<<m_RecordPosition[i].m_CurrptrPosition.m_y<<">\n";
}
void CMainClass::MainFuntion(CHorsePosition m_horse)
{
extern int m_ChessBoardSize_x;//棋盤的位置
extern int m_ChessBoardSize_y;
//把棋子下到棋盤
m_ChessBoard[m_horse.m_CurrptrPosition.m_x][m_horse.m_CurrptrPosition.m_y]=true;
m_record++;//棋子記錄加1
//cout<<"<"<<m_horse.m_CurrptrPosition.m_x<<","<<m_horse.m_CurrptrPosition.m_y<<">\n";
//寫入記錄集合
m_RecordPosition[m_record].m_CurrptrPosition.m_x=m_horse.m_CurrptrPosition.m_x;
m_RecordPosition[m_record].m_CurrptrPosition.m_y=m_horse.m_CurrptrPosition.m_y;
m_horse.SetAbutPosition();//設置8個相鄰節(jié)點
CHorsePosition currptr;
for(int i=1;i<=8;i++)
{
//對可能的8個方位進行遞歸
currptr.m_CurrptrPosition.m_x=m_horse.m_AbutPosition[i].m_x;
currptr.m_CurrptrPosition.m_y=m_horse.m_AbutPosition[i].m_y;
if((!OverFlow(currptr))&&(!finded))//不溢出
{
MainFuntion(currptr);
}
}//結束遞歸
if(m_record==m_ChessBoardSize_x*m_ChessBoardSize_y)//8個方向都不可以走,判斷下一步是否可以回到原點
{
//如果可以回到原點
if(RecurOrigin(m_horse)==true)//已經把整個棋盤遍歷一遍//而且可以回到原點
{
finded=true ;
//ShowHorseProcess();//輸出遍歷過程
}
else
{
//往回走
//撤銷棋子
m_ChessBoard[m_horse.m_CurrptrPosition.m_x][m_horse.m_CurrptrPosition.m_y]=false;
//刪除記錄集合
m_record--;
}
}
else
{
//8個方向不可以走//而且下一步回不到原點
//往回走
//撤銷棋子
m_ChessBoard[m_horse.m_CurrptrPosition.m_x][m_horse.m_CurrptrPosition.m_y]=false;
//刪除記錄集合
m_record--;
}
}
void CMainClass::OninitChessBoard()
{
//初始化棋盤
extern int m_ChessBoardSize_x;//棋盤的位置
extern int m_ChessBoardSize_y;
for(int i=1;i<=m_ChessBoardSize_x;i++)
for(int j=1;j<=m_ChessBoardSize_y;j++)
m_ChessBoard[i][j]=false;
}
bool CMainClass::OverFlow(CHorsePosition m_horse)
{
//溢出判斷
extern int m_ChessBoardSize_x;//棋盤的位置
extern int m_ChessBoardSize_y;
if((m_horse.m_CurrptrPosition.m_x<1)||(m_horse.m_CurrptrPosition.m_y<1)||(m_horse.m_CurrptrPosition.m_y>m_ChessBoardSize_y)||(m_horse.m_CurrptrPosition.m_x>m_ChessBoardSize_x))
return true;//溢出棋盤
if(m_ChessBoard[m_horse.m_CurrptrPosition.m_x][m_horse.m_CurrptrPosition.m_y]==true)
return true; //位置已經踏過
return false;
}
bool CMainClass::AllPositionAcess()
{
//判斷是否已經遍歷完整個棋盤
extern int m_ChessBoardSize_x;//棋盤的形狀
extern int m_ChessBoardSize_y;
for(int i=1;i<=m_ChessBoardSize_x;i++)
for(int j=1;j<=m_ChessBoardSize_y;j++)
if(m_ChessBoard[i][j]==false)
return false;
return true;
}
bool CMainClass::RecurOrigin(CHorsePosition m_horse)
{
int k=0;
//判斷馬的下一步是否可以回到原點
extern int O_X,O_Y;
m_horse.SetAbutPosition();//設置下一步要到達的點
for(int i=1;i<=8;i++)
if((m_horse.m_AbutPosition[i].m_x==O_X)&&(m_horse.m_AbutPosition[i].m_y==O_Y))
{
k=1;
break;
}
if(k==1)
return true;
else
return false;
}
void CMainClass::Oninit()
{
OninitChessBoard();//初始化棋盤
m_record=0;//記錄為空
for(int i=1;i<=64;i++)
{
m_RecordPosition[i].m_CurrptrPosition.m_x=0;
m_RecordPosition[i].m_CurrptrPosition.m_y=0;
}
finded=false;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -