【算法】棋盘覆盖问题

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int t; // 总共用的骨牌数量 
int board[256][256]; 

void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
	if(size==1) return; // 棋盘只有一个方格,且是特殊方格
	int s,t1; // s 为划分的子棋盘大小,t1为本次覆盖所用的L型骨牌编号
	t1 == ++t; // 本次所用的L型骨牌编号 
	s = size/2; // 划分棋盘 
	
	if(dr<tr+s && dc<tc+s){ // 特殊方格在左上角子棋盘中 
		ChessBoard(tr,tc,dr,dc,s); // 递归处理左上角子棋盘 
	} 
	else{
		board[tr-1+s][tc-1+s] = t1; // 填充此次骨牌的一部分 
		ChessBoard(tr,tc,tr-1+s,tc-1+s,s); //递归处理 
	}
	
	if(dr<tr+s && dc>=tc+s){ // 特殊方格在右上角子棋盘中 
		ChessBoard(tr,tc+s,dr,dc,s); // 递归处理右上角子棋盘 
	} 
	else{
		board[tr-1+s][tc+s] = t1; // 填充此次骨牌的一部分 
		ChessBoard(tr,tc+s,tr-1+s,tc+s,s); //递归处理 
	}
	
	if(dr>=tr+s && dc<tc+s){ // 特殊方格在左下角子棋盘中 
		ChessBoard(tr+s,tc,dr,dc,s); // 递归处理左下角子棋盘 
	} 
	else{
		board[tr+s][tc-1+s] = t1; // 填充此次骨牌的一部分 
		ChessBoard(tr+s,tc,tr+s,tc-1+s,s); //递归处理 
	}
	
	if(dr>=tr+s && dc>=tc+s){ // 特殊方格在右下角子棋盘中 
		ChessBoard(tr+s,tc+s,dr,dc,s); // 递归处理右下角子棋盘 
	} 
	else{
		board[tr+s][tc+s] = t1; // 填充此次骨牌的一部分 
		ChessBoard(tr+s,tc+s,tr+s,tc+s,s); //递归处理 
	}	
}

int main()
{
	int tr,tc,dr,dc,size;
	cin>>tr>>tc>>dr>>dc>>size;
	ChessBoard(tr,tc,dr,dc,size);
	cout<<t<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值