⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainclass.cpp

📁 用vc实现的马跳棋盘
💻 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个相邻节点
  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 + -