zoukankan      html  css  js  c++  java
  • 棋盘覆盖(分治)

    问题描述

    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;
    }
  • 相关阅读:
    重拾数学--初中--有理数
    Python中的运算符
    PyQt5实现虚拟摇杆
    Python无重复字符的最长子串
    Python两数相加
    Python两数之和
    DBMS,B树和B+树
    浮点数表示
    Lamada表达式
    Java编程思想P159页的错误
  • 原文地址:https://www.cnblogs.com/Initial-C-/p/13629327.html
Copyright © 2011-2022 走看看