棋盘覆盖问题(附C语言实现)

问题描述

        在一个2k × 2k 个方格组成的棋盘中恰有一个方格与其他方格不同(图中标记为-1 的方格),称之为特殊方格。现用L 型(占3 个小格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是(4k −1) / 3 。在下表给出的一个覆盖方案中,k=2,相同的3个数字构成一个纸片。

代码

#include <iostream>
using namespace std;

int board[65][65], tile; /* tile 为纸片编号*/

void chessboard(int tr, int tc, int dr, int dc, int size) {
    int t, s;
    if (size == 1) return;
    t = tile++;
    s = size / 2;
    if (tr + s > dr && 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);
    }
}
void prt1(int b[][65], int n) {
    int i, j;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++) printf("%3d", b[i][j]);
        printf("/n");
    }
}
int main() {
    int size, dr, dc;
    printf("input size(4/8/16/64):/n");
    scanf("%d", &size);
    printf("input the position of special block(x,y):/n");
    scanf("%d%d", &dr, &dc);
    board[dr][dc] = -1;
    tile++;
    chessboard(1, 1, dr, dc, size);
    prt1(board, size);
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值