棋盘覆盖(分治)

问题描述

Description

在一个2k × 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的棋盘上除特殊方格以外的所有方格,L型骨牌不能旋转,且任何两个L型骨牌不得重叠覆盖。

棋盘和标记为红色的特殊方格                      4种L型骨牌                          

Input

第一行是一个T,表示案例数。对于每一个案例,有三个数KXY分别表示在一个2k × 2k的棋盘中,在第X行第Y列有一个特殊方格。1 ≤ K ≤ 8

1 ≤ XY ≤ 2k

Output

输出这个被骨牌覆盖的棋盘,分别用a,b,c,d表示四种骨牌(分别用以下四种字符图形表示),特殊方格用*号表示。

aa      bb    c      d
a        b    cc    dd

具体输出见sample Output

Sample Input

2
2 1 2
1 1 1

Sample Output

c*bb
ccdb
cddd
ccdd
*d
dd

问题分析

在以(1,1)为起点的n阶的方阵中,若特殊方块在左上角,

不难发现(n/2,n/2+1),(n/2+1,n/2),(n/2+1,n/2+1)三个格子将会是d组成的三角,

这样一来将方块十字分成四份,每个小方块就相当于都有一个已经覆盖的方块(特殊方块)

那就是递归的思想

代码实现

#include<iostream>
using namespace std;
char bian[1000][1000];
int x=1;
void chessBord(int li,int lr,int sl,int sr,int siz ){///其中li方正的左上角的行,lr左上角的列,sl特殊块的行,sr特殊块的的列
    if(siz==1) return ;
    bool t=false;
    int s=siz/2;
    if(sl>li+s&&sr>lr+s){///特殊方块在右下角
        bian[li+s][lr+s]='a';
        bian[li+s+1][lr+s]='a';
        bian[li+s][lr+s+1]='a';
        chessBord(li+s,lr+s,sl,sr,s);
    }
    else{///不在此象限
        chessBord(li+s,lr+s,li+s+1,lr+s+1,s);
    }
    if(sl>li+s&&sr<=lr+s){///特殊方块在左下角
        bian[li+s][lr+s]='b';
        bian[li+s][lr+s+1]='b';
        bian[li+s+1][lr+s+1]='b';
        chessBord(li+s,lr,sl,sr,s);
    }
    else{
        chessBord(li+s,lr,li+s+1,lr+s,s);
    }
    if(sl<=li+s&&sr>lr+s){///特殊方块在右上角
        bian[li+s][lr+s]='c';
        bian[li+s+1][lr+s]='c';
        bian[li+s+1][lr+s+1]='c';
        chessBord(li,lr+s,sl,sr,s);
    }
    else{

        chessBord(li,lr+s,li+s,lr+s+1,s);
    }
    if(sl<=li+s&&sr<=lr+s){///特殊方块在左上角
        bian[li+s][lr+s+1]='d';
        bian[li+s+1][lr+s+1]='d';
        bian[li+s+1][lr+s]='d';
        chessBord(li,lr,sl,sr,s);
    }
    else{

        chessBord(li,lr,li+s,lr+s,s);
    }
}
int power(int a,int b)
{
    int ans = 1;
    while(b){
        if(b&1){
            ans*=a;
        }
        a*=a;
        b>>=1;
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int k,x,y;
        cin>>k>>x>>y;
        int length=0;
        length = power(2,k);
        for(int i=1;i<=length;i++){
            for(int j=1;j<=length;j++){
                bian[i][j]='0';
            }
        }
        chessBord(0,0,x,y,length);
        bian[x][y]='*';
        for(int i=1;i<=length;i++){
            for(int j=1;j<=length;j++){
                cout<<bian[i][j];
            }
        cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2020-09-07 21:22  小白小承  阅读(359)  评论(0编辑  收藏  举报
分享到: