MFC绘制棋盘算法

本文探讨了棋盘覆盖问题,即在一个2k*2K的棋盘中,使用L型骨牌覆盖特殊方格之外的所有方格,不使骨牌重叠。通过四次详细的分割过程解释了解题思路,并提供了使用MFC进行代码实现,包括头文件代码、程序代码和ondraw函数,用于画出棋盘界面和处理左键点击。最终展示了动态运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


上课的时候看到一个棋盘算法问题,我觉得很有意思,就用MFC把它做成可视化的。

一、棋盘覆盖问题

在一个2k*2K个方格组成的棋盘,恰好有一个方格和其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘。显然特殊方格出现的位置有4^k情况
在这里插入图片描述
棋盘覆盖问题要求用如图(b)所示的L型骨牌给定棋盘上特殊方格以外的所有方格,且任何2个L型骨牌不得重叠
在这里插入图片描述

二、详细求解过程

棋盘有一个特殊方格
在这里插入图片描述
第一次分割
在这里插入图片描述
第二次分割
在这里插入图片描述
第三次分割
在这里插入图片描述
第四次分割
在这里插入图片描述

三、代码实现

主要用MFC实现的,这里就截图手写部分代码,其他部分框架都是自动生成的。用的是单文档的。
头文件代码
第一个是程序代码。
第二个是开启一个线程不开启的程序中途单击或者移动会卡死。
在这里插入图片描述
ondraw函数代码画出棋盘的界面
在这里插入图片描述
这里就是棋盘代码的整个实现程序和左键单击代码

/*
整个棋盘算法实现的程序
*/
void CChessboardView::ChessBoard(int tr,int tc,int dr,int dc,int size)
{
   
   
	Sleep(200);//让程序暂停下
	RECT rt;
	int s;
	if(size==1)
	{
   
   
	
		return;
	}
	int t =tile++;
	CString count;
	s=size/2;

	if(dr<tr+s&&dc<tc+s)
		ChessBoard(tr,tc,dr,dc,s);
	else
	{
   
   
		Board[tr+s-1][tc+s-1]=t;
	    
		//后面几个其实以此类推就行了基本也都是一样的
		//画一个绿色的背景格子
		CClientDC dc(this);
		CBrush pNewBrush(RGB(0,255,0)); 
		CBrush *pOldBrush=dc.SelectObject(&pNewBrush);
		dc.Rectangle((tr+s)*50,(tc+s)*50,(tr+s)*50+50,(tc+s)*50+50);//
		dc
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值