棋盘覆盖问题

问题描述

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

输入:给定k(1<=k<=10),表示棋盘大小为  2^k×2^k     ,在给出特殊方格坐标x,y(0<=x,y<=1024)。

输出,一个边长为2^k的方阵,特殊方格编号0,所有骨牌从1开始编号,数据间间隔TAB。

样例输入:2 0 1

样例输出:

2    0    3    3

2    2    1    3

4    1    1    5

4    4    5    5

 

1<<10意思是2的十次方

k>>1意思是k除以2(整除)

 

#include
#include
#include
#include
using namespace std;
int a[1<<10][1<<10],goalx,goaly,k,tmp;
void division(int x,int y,int gx,int gy,int k)
{
    if(k==0)return;
    int newx=x+k-1,newy=y+k-1;
    tmp++;
    int t=tmp;
    if(gx<=newx&&gy<=newy) division(x,y,gx,gy,k>>1);
    else 
    {
        a[newx][newy]=t;
        division(x,y,newx,newy,k>>1);
    }
    
    if(gx>newx&&gy<=newy) division(x+k,y,gx,gy,k>>1);
    else 
    {
        a[newx+1][newy]=t;
        division(x+k,y,newx+1,newy,k>>1);
    }
    
    if(gx<=newx&&gy>newy) division(x,y+k,gx,gy,k>>1);
    else 
    {
        a[newx][newy+1]=t;
        division(x,y+k,newx,newy+1,k>>1);
    }
    
    if(gx>newx&&gy>newy) division(x+k,y+k,gx,gy,k>>1);
    else 
    {
        a[newx+1][newy+1]=t;
        division(x+k,y+k,newx+1,newy+1,k>>1);
    }
    
    
}
int main()
{
    cin>>k>>goalx>>goaly;
    goalx++;goaly++;
    division(1,1,goalx,goaly,k);
    for(int i=1;i<=(2*k);i++)
     {
         for(int j=1;j<=(2*k);j++)cout<          cout<          
     }
     
}

你可能感兴趣的:(分治)