注册 登录
编程论坛 C++教室

棋盘覆盖这道题能帮忙看一下吗?

Jason_ 发布于 2019-07-23 21:39, 1474 次点击
题目描述
在一个2k(这里为2的k次方)×2k个方格组成的棋盘中恰有一个方格与其它方格不同(图中标记为-1的方格),称之为特殊方格。现用L型(占3个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是(4k-1)/3。在下表给出的一个覆盖方案中,k=2,相同的3个数字构成一个纸片。
输入
一行,三个整数n,tr,tc,分别表示棋盘尺寸(每行方格数),特殊方格所在行,特殊方格所在列。其中2<=n<=64。
输出
n行,每行n个整数,每个整数的场宽为5,表示被纸片覆盖的棋盘。


题目网址:http://oj.
1 回复
#2
rjsp2019-07-26 16:43
瞎写了一个,对不对我不知道,因为没有帐号提交

程序代码:
#include <cstdio>

void foo( unsigned n, unsigned tr, unsigned tc, int matrix[], int& index )
{
    if( n < 2 )
        return;

    int x = (tr>=n/2)*2 + (tc>=n/2); // 已经标了号的格子在第几象限。0:左上, 1:右上, 2:左下, 3:右下
    if( x != 0 )
        matrix[(n/2-1)*64+(n/2-1)] = index;
    if( x != 1 )
        matrix[(n/2-1)*64+(n/2+0)] = index;
    if( x != 2 )
        matrix[(n/2+0)*64+(n/2-1)] = index;
    if( x != 3 )
        matrix[(n/2+0)*64+(n/2+0)] = index;
    ++index;

    foo( n/2, x==0?tr:n/2-1, x==0?tc:n/2-1, matrix, index );
    foo( n/2, x==1?tr:n/2-1, x==1?tc-n/2:0, matrix+n/2, index );
    foo( n/2, x==2?tr-n/2:0, x==2?tc:n/2-1, matrix+n/2*64, index );
    foo( n/2, x==3?tr-n/2:0, x==3?tc-n/2:0, matrix+n/2*64+n/2, index );
}

int main( void )
{
    unsigned n, tr, tc;
    scanf( "%u%u%u", &n, &tr, &tc );
    tr-=1, tc-=1; // base1 的都是傻逼

    int matrix[64*64];
    matrix[tr*64+tc] = -1;
    int index = 1;
    foo( n, tr, tc, matrix, index );

    for( unsigned r=0; r!=n; ++r )
    {
        for( unsigned c=0; c!=n; ++c )
            printf( "%5d", matrix[r*64+c] );
        putchar( '\n' );
    }
}

1