【分治算法-02】算法经典问题

算法经典问题

棋盘覆盖问题
  1. 问题描述:
    问题描述
  2. 自我理解:对于仅存在一个奇异点,想到奇异点的填充肯定可以通过一个“L”形状构成一个正方形。我们可以通过不断缩小方格尺寸(我们的目标是每一个缩小尺寸到4✖4的小方格中都有一个“认为规定的奇异点,这些相连奇异点同时也能构成一个"L“形状,但也可以想成是我们之前通过"L"模型划分的”人为奇异点“),因为之可能存在有限种情况。不好分析L的摆放模式,但是我们可以构造”奇异点“。全部分清奇异点存在的种类,然后再通过”L“形去填充这些空白的”格子“。
  3. 受到启发于这个宝藏博客”棋盘覆盖问题的图形解答
//棋盘覆盖问题
#include <stdio.h>
#define MaxValue 100
void chessboard(int tx,int ty,int x,int y,ing size)
{
	int s =gupai++;
	int mid = size/2;
	if(size==1)
		return;
	if(tx<x+mid && ty<y+mid)//左方格上
	{
		chessboard(tx,ty,x,y,mid);
	}
	else//不在左上方的情况
	{//假定奇异点在右下角
		QiPan[x+mid-1][y+mid-1] = s;
		chessboard(tx+mid-1,ty+mid-1,x,y,mid);
	}
	if((tx<x+mid) && (ty>=y+mid))//奇异点在右上方
	{
		chessboard(tx,ty,x,y+mid,mid);
	}
	else
	{//规定新的奇异点在右上方子棋盘的左下角
	//如果不在右上方
		QiPan[x+mid-1][y+mid] = s;
		chessboard(x+mid-1,y+mid,x,y+mid,mid);
	}
	if(tx>=x+mid&&ty<y+mid)//判断是否在左下方
	{
		chessboard(tx,ty,x+mid,y,mid);
	}
	else
	{
		//如果奇异点不在左下角的棋盘里
		//规定左下角子棋盘的右上角点为奇异点
		QiPan[x+mid][y+mid-1] = s;
		chessboard(x+mid,y+mid-1,x+mid,y,mid);
	}
	if((tx>=x+mid)&&(ty>=y+mid))//如果奇异点在右下角点
	{
		chessboard(tx,ty,x+mid,y+mid,mid);
	}
	else 
	{
	//如果不在右下角点
	//规定右下子棋盘的左上角点为新的奇异点
	QiPan[x+mid][y+mid] = s;
	chessboard(x+mid,x+mid,x+mid,y+mid,mid);
	}
int main ()
{
	//输入方格的尺寸,奇异方格的位置
	int tx,ty,x=0,y=0,size;
	int QiPan[MaxValue][MaxValue];
	int gupai =0;
	scanf("%d %d %d",&tx,&ty,&size);
	chessboard(tx,ty,x,y,size);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值