算法设计与分析(棋盘覆盖

棋盘覆盖问题(棋盘骨牌覆盖)

在计算机科学中,棋盘覆盖问题(也称为骨牌覆盖问题)是一个经典的递归问题。问题要求使用特定形状的骨牌(在本例中为L型骨牌)覆盖一个棋盘,除了一个特定格子(特殊方格)外,不留任何空隙。

问题描述

给定一个2的n次方大小的棋盘(在本例中为8x8),除了棋盘上的一个特殊方格外,使用L型骨牌(占据3个连续方格)覆盖整个棋盘。

解决方案

我们使用递归的方法来解决这个问题。递归的基本思想是:将大棋盘分割成更小的棋盘,并在每个小棋盘上应用相同的策略,直到棋盘的大小为1x1(此时无需覆盖)。

以下是使用C++实现的代码:

#include<iostream>  
  
using namespace std;  
  
int Board[8][8]; // 棋盘  
int tile = 1;    // 骨牌编号  
  
// 棋盘覆盖函数  
// tr, tc: 当前子棋盘的左上角行列索引  
// dr, dc: 特殊方格的行列索引  
// size: 当前子棋盘的大小(2的倍数)  
void ChessBoard(int tr, int tc, int dr, int dc, int size) {  
    if (size == 1) {  
        return; // 棋盘大小为1x1时,无需覆盖  
    }  
    int t = tile++, // 分配一个新的骨牌编号  
        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);	// tr+s, tc+s-1 就是上一步覆盖的位置 
	}
	
	// 覆盖右下角子棋盘 
	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);
	}
}  
  
int main() {  
    ChessBoard(0, 0, 4, 4, 8); // 从整个棋盘开始,特殊方格在(4, 4)  
    for (int i = 0; i < 8; i++) {  
        for (int j = 0; j < 8; j++) {  
            cout << Board[i][j] << '\t';  
        }  
        cout << endl;  
    }  
    return 0;  
}

当运行上述代码时,它将输出一个8x8的棋盘,其中除了特殊方格(在本例中为(4, 4))外,所有方格都被L型骨牌覆盖,每个骨牌都被赋予了一个唯一的编号。
以上就是使用递归方法解决棋盘覆盖问题的C++实现。这种方法不仅展示了递归的强大功能,还体现了问题分解和逐步解决的思想。

输出结果

当数组在全局变量区定义时,默认初值为0。
当数组在局部变量区定义时,如果不写“ {} ”,则默认的初值为乱码。
当数组在局部变量区定义时,如果写“ {} ”或给某几位赋值时,则其他未赋值的数默认初值为0。

因此这里定义的首个特殊方格为0;

在这里插入图片描述

代码规律

在这里插入图片描述

同色的是相关的,要变一起变动。

小结:

关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||竞赛资料|| ||课程资料||
添加我的公众号即可:

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天玑y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值