2.6 棋盘覆盖

这篇博客探讨了2^k * 2^k棋盘的骨牌覆盖问题,通过递归处理每个2^(k - 1) * 2^(k - 1)的子棋盘,寻找特殊方格并进行覆盖。当遇到无特殊方格的子棋盘时,会在特定位置放置骨牌,形成L型布局。覆盖过程从棋盘中心开始向四周扩展,根据四个角块的情况放置骨牌。

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

四种情况的骨牌

                                           

基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。

 

4个块中有一个块包含一个特殊方格,其他 3 个没有特殊方格,它们 3 个组成了一个L型骨牌。

覆盖的过程是从棋盘的中间向两边扩散:

如果左上角的块内没有特殊方格,则在左上角的块的右下角覆盖一个特殊方格。

如果右上角的块内没有特殊方格,则在右上角的块的左下角覆盖一个特殊方格。

如果左下角的块内没有特殊方格,则在左下角的块的右上角覆盖一个特殊方格。

如果右下角的块内没有特殊方格,则在右下角的块的左上角覆盖一个特殊方格。

 

实现 

#include<iostream>
#include<iomanip>
#define N 8
using namespace std;

static int number = 1;
static int board[N][N] = { 0 };

void ChessBoard(int tr, int tc, int dr, int dc, int size);
int main()
{
	int dr, dc,i,j;
	cout << "请输入初始特殊方格的位置x和y:";
	cin >> dr>>dc;
	ChessBoard(0,0,dr,dc,N);
	for (i = 0; i < N; i++)
	{
		for (j = 0;j<N;j++)
			cout<<setw(3)<< board[i][j];
		cout << endl;
	}
	system("pause");
	return 0;
}
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
	if (size == 1)
		return;
	int t = number++;
	int 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;
		ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
	}
	if (dr < tr + s&&dc >= tc + s)//右上
	{
		ChessBoard(tr,tc+s,dr,dc,s);
	}
	else
	{
		board[tr + s - 1][tc + s] = t;
		ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
	}
	if (dr >= tr + s&&dc < tc + s)//左下
	{
		ChessBoard(tr+s,tc,dr,dc,s);
	}
	else
	{
		board[tr + s][tc + s - 1] = t;
		ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
	}
	if (dr >= tr + s&&dc >= tc + s)//右下
	{
		ChessBoard(tr+s,tc+s,dr,dc,s);
	}
	else
	{
		board[tr + s][tc + s] = t;
		ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值