바둑판 덮어쓰기(귀속+분할)

2227 단어
문제 설명:
하나에 2^k×2^k개의 격자로 구성된 바둑판에는 다른 격자와 달리 이 격자를 특수한 격자라고 하고 이 격자를 특수한 바둑판이라고 한다.바둑판 덮어쓰기 문제에서 그림에 표시된 4가지 서로 다른 형태의 L형 골패로 주어진 특수 바둑판에 특수한 칸을 제외한 모든 칸을 덮어쓰고 그 어떠한 2개의 L형 골판도 겹쳐서 덮어쓰면 안 된다.
분석: 하나의 큰 네모난 칸을 네 부분으로 나누면 그 특수한 네모난 칸은 반드시 네 부분 중 일부분에 있고 작은 네모난 칸의 그 부분에 대해 우리는 이 부분에 귀속되고 다른 부분에 대해 우리는 네 부분의 경계에 있는 작은 네모난 칸을 표시한 다음에 이를 특수한 네모난 칸으로 간주하여 귀속시킨다.
코드:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define LL long long
#define mod 10000000007
#define mem(x) memset(x,0,sizeof(x))

using namespace std;

const int maxn = 1000 + 5, inf = 0x3f3f3f3f;

int res[maxn][maxn];
static int t = 0;// 
void chess(int a,int b,int aa,int bb,int length){
    //a,b X,Y ,aa,bb ,length 
    if(length == 1) return;
    int l = length/2;
    t++;
    int tmp = t;
    if(aa < a+l && bb < b+l) chess(a,b,aa,bb,l);// 
    else{
        res[a+l-1][b+l-1] = tmp;
        chess(a,b,a+l-1,b+l-1,l);
    }
    if(aa < a+l && bb >= b+l) chess(a,b+l,aa,bb,l);// 
    else{
        res[a+l-1][b+l] = tmp;
        chess(a,b+l,a+l-1,b+l,l);
    }
    if(aa >= a+l && bb < b+l) chess(a+l,b,aa,bb,l);// 
    else{
        res[a+l][b+l-1] = tmp;
        chess(a+l,b,a+l,b+l-1,l);
    }
    if(aa >= a+l && bb >= b+l) chess(a+l,b+l,aa,bb,l);// 
    else{
        res[a+l][b+l] = tmp;
        chess(a+l,b+l,a+l,b+l,l);
    }
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int a,b,aa,bb,k,d;
    while(~scanf("%d%d%d",&k,&aa,&bb)){// , 
        mem(res);
        a = b = 1;
        chess(a,b,aa,bb,k);
        for(int i=1;i<=k;i++){
            for(int j=1;j<=k;j++){
                printf("%3d",res[i][j]);
            }
            printf("
"); } } }

 
다음으로 전송:https://www.cnblogs.com/seven7777777/p/10278716.html

좋은 웹페이지 즐겨찾기