问题描述
在一个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 <stdio.h>
#include <stdlib.h>
#include<cstdlib>
#include<iostream>
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<<a[i][j]<<" ";
cout<<endl;
}
}