题目描述
在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
输入要求
输入一个整数k,k<=5;
输入特殊格子的坐标x,y。
输出要求
输出一个由数值表示的二维矩阵。填充规则如下:
(1)用数值填充方格;
(2)特殊方格数值为0;
(3)从中心点开始;然后左上、右上、左下、右下的计数顺序填数;同一块用相同数值表示;
(4)每个数值占4个位置空间;右对齐,左补空格。
输入样例
3
1 2
输出样例
3 3 4 4 8 8 9 9
3 2 0 4 8 7 7 9
5 2 2 6 10 10 7 11
5 5 6 6 1 10 11 11
13 13 14 1 1 18 19 19
13 12 14 14 18 18 17 19
15 12 12 16 20 17 17 21
15 15 16 16 20 20 21 21
#include<iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int Board[33][33]={0};
static int tile=0;
int cifang(int k)
{
int result=1;
for(int i=0;i<k;i++)
result=result*2;
return result;
}
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
if(size==1)
return ;
tile++;
int t = tile,s = size/2;
if(dr<tr+s && dc<tc+s)//如果在右上角
ChessBoard(tr,tc,dr,dc,s);
else{
Board[tr+s-1][tc+s-1]=t;//不在右上角,则自己加一块
ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dr<tr+s && dc>=tc+s)
ChessBoard(tr,tc+s,dr,dc,s);
else{
Board[tr+s-1][tc+s]=t;
ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s && dc<tc+s)
ChessBoard(tr+s,tc,dr,dc,s);
else{
Board[tr+s][tc+s-1]=t;
ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if(dr>=tr+s && dc >=tc+s)
ChessBoard(tr+s,tc+s,dr,dc,s);
else{
Board[tr+s][tc+s]=t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main()
{
int k;
while(cin>>k)
{
int x,y;
cin>>x>>y;
int i,j;
int tr =0, tc=0;
int size = cifang(k);
int length = cifang(k);
ChessBoard(tr,tc,x,y,size);
for(i=0;i<length;i++)
{
for(j=0;j<length;j++)
{
cout.width(3);
printf("%4d",Board[i][j]);
if(j==size-1){
cout<<endl;
}
}
}
}
return 0;
}