0
点赞
收藏
分享

微信扫一扫

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



目录

  • 棋盘覆盖问题(棋盘骨牌覆盖)
  • 问题描述
  • 解决方案
  • 输出结果
  • 代码规律
  • 小结:


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

在计算机科学中,棋盘覆盖问题(也称为骨牌覆盖问题)是一个经典的递归问题。问题要求使用特定形状的骨牌(在本例中为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;

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

代码规律

算法设计与分析(棋盘覆盖_笔记_02

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

举报

相关推荐

0 条评论