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

📄 mychessboard.cpp

📁 棋盘覆盖问题的算法源程序
💻 CPP
字号:
// MyChessBoard.cpp: implementation of the CMyChessBoard class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ChessBoard.h"
#include "MyChessBoard.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyChessBoard::CMyChessBoard()
{

}

CMyChessBoard::~CMyChessBoard()
{
	delete _p_Mem;
	delete _p_ChessBoard;
}

void CMyChessBoard::Init(void)
{
	
	int i;
	_p_Mem=new unsigned int [_i_BoardHeight*_i_BoardWidth];
	_p_ChessBoard=new unsigned int * [_i_BoardHeight];

	_p_ColorMem=new color [_i_BoardHeight*_i_BoardWidth];
	_p_ColorBoard=new color * [_i_BoardHeight];

	for (i=0;i<_i_BoardHeight;i++)
	{
		_p_ChessBoard[i]=&_p_Mem[i*_i_BoardWidth];
		_p_ColorBoard[i]=&_p_ColorMem[i*_i_BoardWidth];
	}
	//_p_ChessBoard[_i_PlacedX][_i_PlacedY]=0;
	
	memset(_p_Mem,0,_i_BoardHeight*_i_BoardWidth*(sizeof(int)/sizeof(char)));	   //0作为背景
	//for (i=0;i<=_i_BoardHeight-1;i++)
	//{
	//	for (j=0;j<=_i_BoardWidth-1;j++)
	//		TRACE("%d\t",_p_ChessBoard[i][j]);
	//	TRACE("\n");
	//}
	memset(_p_ColorMem,0,_i_BoardHeight*_i_BoardWidth*(sizeof(int)/sizeof(char)));//backColor作为背景
	//for (i=0;i<=_i_BoardHeight-1;i++)
	//{
	//	for (j=0;j<=_i_BoardWidth-1;j++)
	//		TRACE("%d\t",_p_ColorBoard[i][j]);
	//	TRACE("\n");
	//}
	_p_ColorBoard[_i_PlacedX][_i_PlacedY]=white;       //白色作为残局的颜色
	title=1;//从数字1开始标注
	return;
}
/*
 *int tr:棋盘左上角的行号
 *int tc:棋盘左上角的列号
 *int dr:特殊方格的行号
 *int dc:特殊方格的列号
 *int size:棋盘的规格
 */
void CMyChessBoard::FillChessBoard(int tr,int tc,int dr,int dc,int size)
{
	if (size==1) return;

	int		t=title++;
	int		s=size/2;
	/********************************************************/
	//覆盖左上角子棋盘
	if ((dr<tr+s) && (dc<tc+s))
	{   
		//特殊方格在此棋盘中
		FillChessBoard(tr,tc,dr,dc,s);
	}
	else
	{
		//特殊方格不在此棋盘中
		//用t号L型骨牌覆盖右下角
		_p_ChessBoard[tr+s-1][tc+s-1]=t;
		//添颜色

		TRACE("%d\n",t);
		//覆盖其余方格
		FillChessBoard(tr,tc,tr+s-1,tc+s-1,s);
	}

	/********************************************************/
	//覆盖右上角子棋盘
	if ((dr<tr+s) && (dc>=tc+s))
	{   
		//特殊方格在此棋盘中
		FillChessBoard(tr,tc+s,dr,dc,s);
	}
	else
	{
		//特殊方格不在此棋盘中
		//用t号L型骨牌覆盖左下角
		_p_ChessBoard[tr+s-1][tc+s]=t;
		TRACE("%d\n",t);
		//覆盖其余方格
		FillChessBoard(tr,tc+s,tr+s-1,tc+s,s);
	}

	/********************************************************/
	//覆盖左下角子棋盘
	if ((dr>=tr+s) && (dc<tc+s))
	{   
		//特殊方格在此棋盘中
		FillChessBoard(tr+s,tc,dr,dc,s);
	}
	else
	{
		//特殊方格不在此棋盘中
		//用t号L型骨牌覆盖右上角
		_p_ChessBoard[tr+s][tc+s-1]=t;
		TRACE("%d\n",t);
		//覆盖其余方格
		FillChessBoard(tr+s,tc,tr+s,tc+s-1,s);
	}

	/********************************************************/
	//覆盖右下角子棋盘
	if ((dr>=tr+s) && (dc>=tc+s))
	{   
		//特殊方格在此棋盘中
		FillChessBoard(tr+s,tc+s,dr,dc,s);
	}
	else
	{
		//特殊方格不在此棋盘中
		//用t号L型骨牌覆盖左上角
		_p_ChessBoard[tr+s][tc+s]=t;
		TRACE("%d\n",t);
		//覆盖其余方格
		FillChessBoard(tr+s,tc+s,tr+s,tc+s,s);
	}
}
/*
        _______________________________________________
3  		|3  		4  		4  		8  		8  		9 |		9  
3  		|0  		2  		4  		8  		7  		7 |		9  
5  		|2  		2  		6  		10  	10  	7 |		11  
5  		|5  		6  		6  		1  		10  	11|  	11  
13  	|13		 	14  	1  		1  		18  	19|  	19  
13  	|12			14  	14  	18  	18  	17|  	19  
15  	|12			12  	16  	20  	17  	17|  	21  
		|  +---------------------------------------+  |
15  	|15|		16  	16  	20  	20	   |21|   	21  
        ~~~~									   ~~~~
框到的区域是需要着色的范围
 */
void CMyChessBoard::SetColor(int i, int j)
{
	int Counter;
	color ColorID;      //选择的本次添涂使用的颜色
	bool  ColorFlag[6]; //当前对应骨牌周围已经使用过的颜色

	if (_p_ColorBoard[i][j]!=backColor)  return; //如果当前i,j点已经被填色,则返回
	if ((i==_i_PlacedX)&&(j==_i_PlacedY)) return;  //当前是,残局位置
	for (Counter=0;Counter<6;Counter++)  ColorFlag[Counter]=false;
	//测试i,j上面的方格
	Counter=1;
	if (i-1>=0) 
	{
		if (_p_ChessBoard[i-1][j]==_p_ChessBoard[i][j])//如果是需要涂颜色的
		{
			Counter++;
			//检查该方格四周的颜色
			if (i-2>=0) //上方                                 
				ColorFlag[_p_ColorBoard[i-2][j]]=true;
			if (j-1>=0) //左面
				ColorFlag[_p_ColorBoard[i-1][j-1]]=true;
			if (j+1<_i_BoardWidth) //右面
				ColorFlag[_p_ColorBoard[i-1][j+1]]=true;
		}
		else
		{
			ColorFlag[_p_ColorBoard[i-1][j]]=true;
		}
	}
	//检测i,j左面的方格
	if (j-1>=0)
	{
		if (_p_ChessBoard[i][j-1]==_p_ChessBoard[i][j])//如果是需要涂颜色的
		{
			Counter++;
			//检查四周方格
			if (i-1>=0) //上方                                 
				ColorFlag[_p_ColorBoard[i-1][j-1]]=true;
			if (j-2>=0) //左面
				ColorFlag[_p_ColorBoard[i-0][j-2]]=true;
			if (i+1<_i_BoardHeight) //下面
				ColorFlag[_p_ColorBoard[i+1][j-1]]=true;
		}
		else
		{
			ColorFlag[_p_ColorBoard[i][j-1]]=true;
		}
	}
	//检测i,j右面的方格
	if (j+1<_i_BoardWidth)
	{
		if (_p_ChessBoard[i][j+1]==_p_ChessBoard[i][j])//如果是需要涂颜色的
		{
			Counter++;
			//检查四周方格
			if (i-1>=0) //上方                                 
				ColorFlag[_p_ColorBoard[i-1][j+1]]=true;
			if (j+2<_i_BoardWidth) //右面
				ColorFlag[_p_ColorBoard[i-0][j+2]]=true;
			if (i+1<_i_BoardHeight) //下面
				ColorFlag[_p_ColorBoard[i+1][j+1]]=true;
		}
		else
		{
			ColorFlag[_p_ColorBoard[i][j+1]]=true;
		}
	}
	//检测i,j下面的方格
	if (i+1<_i_BoardHeight)
	{
		if (_p_ChessBoard[i+1][j]==_p_ChessBoard[i][j])//如果是需要涂颜色的
		{
			Counter++;
			//检查四周方格
			if (j-1>=0) //左方                                 
				ColorFlag[_p_ColorBoard[i+1][j-1]]=true;
			if (j+1<_i_BoardWidth) //右面
				ColorFlag[_p_ColorBoard[i+1][j+1]]=true;
			if (i+2<_i_BoardHeight) //下面
				ColorFlag[_p_ColorBoard[i+2][j+0]]=true;
		}
		else
		{
			ColorFlag[_p_ColorBoard[i+1][j]]=true;
		}
	}

	if (Counter==3) //如果当前检查的方格中有一个棋盘
	{
		//得到当前合适的颜色
		for (int Count=2;Count<6;Count++)
			if (ColorFlag[Count]==false)	
			{
				ColorID=(color)Count;
				break;
			}
		_p_ColorBoard[i][j]=ColorID;
		if (j-1>=0)					//左面
			if (_p_ChessBoard[i+0][j-1]==_p_ChessBoard[i][j]) _p_ColorBoard[i+0][j-1]=ColorID;
		if (j+1<_i_BoardWidth)		//右面
			if (_p_ChessBoard[i+0][j+1]==_p_ChessBoard[i][j]) _p_ColorBoard[i+0][j+1]=ColorID;
		if (i-1>=0)					//上面
			if (_p_ChessBoard[i-1][j+0]==_p_ChessBoard[i][j]) _p_ColorBoard[i-1][j+0]=ColorID;
		if (i+1<_i_BoardHeight)		//下面
			if (_p_ChessBoard[i+1][j+0]==_p_ChessBoard[i][j]) _p_ColorBoard[i+1][j+0]=ColorID;
	}
}
void CMyChessBoard::FillColour()
{
	//
	int			i,j;
	for (i=0;i<=_i_BoardHeight-1;i++)
	{
		for (j=0;j<=_i_BoardWidth-1;j++)
			if  (_p_ColorBoard[i][j]==backColor)  //如果当前还没有填色
			{
					//if ((i==1)&&(j==5))
					SetColor(i,j);
					//else
					//	SetColor(i,j);
					/*
					#ifdef _DEBUG
					int Col,Row;
					for (Row=0;Row<_i_BoardHeight;Row++)
					{
						for (Col=0;Col<_i_BoardWidth;Col++)
							TRACE("%d\t",_p_ColorBoard[Row][Col]);
						TRACE("\n");
					}
					TRACE("----------------------------------------------\n");
					#endif
					*/
			}
	}
}
void CMyChessBoard::Run()
{
	FillChessBoard(0,0,_i_PlacedX,_i_PlacedY,_i_BoardHeight);
#ifdef _DEBUG
	int i,j;
	for (i=0;i<_i_BoardHeight;i++)
	{
		for (j=0;j<_i_BoardWidth;j++)
			TRACE("%d\t",_p_ChessBoard[i][j]);
		TRACE("\n");
	}
	TRACE("----------------------------------------------\n");
#endif
	FillColour();
#ifdef _DEBUG
	for (i=0;i<_i_BoardHeight;i++)
	{
		for (j=0;j<_i_BoardWidth;j++)
			TRACE("%d\t",_p_ColorBoard[i][j]);
		TRACE("\n");
	}
#endif
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -