目录

棋盘覆盖问题

棋盘覆盖问题

[https://csdnimg.cn/release/blogv2/dist/pc/img/activeVector.png VibeCoding·九月创作之星挑战赛 10w+人浏览 2.2k人参与

https://csdnimg.cn/release/blogv2/dist/pc/img/arrowright-line-White.png]( )

题目描述

棋盘覆盖问题是一个经典的计算几何问题,给定一个 2^k x 2^k 的棋盘和一个特殊方块,要求用特殊方块覆盖整个棋盘,其中特殊方块除了一个缺口外都是完整的 L 形。现在要求你使用分治法或减治法来解决这个问题。
要求:
1.实现一个函数 void chessboardCover(int board[][MAX], int tr, int tc, int dr, int dc, int size),其中 board 是二维数组表示棋盘,tr 和 tc 是棋盘左上角的行和列,dr 和 dc 是特殊方块的缺口所在的行和列,size 是当前棋盘的大小。
2.使用分治法或减治法思想,将棋盘划分为四个等大小的子棋盘,递归地覆盖子棋盘,直到覆盖完整个棋盘。

输入格式:

输入棋盘的大小指数k
输入特殊方块的缺口位置坐标x和y

输入样例:


2
1 2

输出样例:


2 2 3 3
2 1 0 3
4 1 1 5
4 4 5 5

#include<stdio.h>
#define MAX 128
int tile = 1;
void chessboardCover(int board[][MAX], int tr,int tc,int dr,int dc,int size) {
    if (size==1) return;
    int t=tile++;
    int s=size/2;
    if (dr<tr+s&&dc<tc+s) {
        chessboardCover(board,tr,tc,dr,dc,s);
} else {
    board[tr + s - 1][tc + s - 1] = t;
        chessboardCover(board, tr, tc, tr + s - 1, tc + s - 1, s);
}
    // 覆盖右上角子棋盘
    if (dr < tr + s && dc >= tc + s) {
                chessboardCover(board, tr, tc + s, dr, dc, s);
    } else {
                board[tr + s - 1][tc + s] = t;
                chessboardCover(board, tr, tc + s, tr + s - 1, tc + s, s);
    }

    // 覆盖左下角子棋盘
    if (dr >= tr + s && dc < tc + s) {
                chessboardCover(board, tr + s, tc, dr, dc, s);
    } else {
                board[tr + s][tc + s - 1] = t;
                chessboardCover(board, tr + s, tc, tr + s, tc + s - 1, s);
    }

    // 覆盖右下角子棋盘
    if (dr >= tr + s && dc >= tc + s) {
                chessboardCover(board, tr + s, tc + s, dr, dc, s);
    } else {
                board[tr + s][tc + s] = t;
                chessboardCover(board, tr + s, tc + s, tr + s, tc + s, s);
    }
}

// 打印棋盘
void printBoard(int board[][MAX], int size) {
        for (int i = 0; i < size; i++) {
                    for (int j = 0; j < size; j++) {
                                    printf("%2d “, board[i][j]);
                    }
                    printf("\n”);
        }
}

int main() {
        int board[MAX][MAX] = {0}; // 初始化棋盘
    
        int k;
        printf(“请输入棋盘的大小指数 k:”);
        scanf("%d", &k);
    
        int size = 1 « k; // 计算棋盘大小
    
        // 假设特殊方块的缺口在 (x, y) 处
        int x, y;
        printf(“请输入特殊方块的缺口位置坐标 x 和 y:”);
        scanf("%d %d", &x, &y);
    
        // 覆盖棋盘
        chessboardCover(board, 0, 0, x, y, size);
    
        // 打印覆盖后的棋盘
        printf(“覆盖后的棋盘:\n”);
        printBoard(board, size);
    
        return 0;
}