棋手楚继光和张琪曼一动不动地在期盼前已经沉默地坐了五个小时。
他们全神贯注地盯着每粒棋子。
突然,楚继光说:“原则上我是反对在下棋时说话的,但是我现在不得不开口问:现在究竟该谁下一步棋了?”
张琪曼说:“谁先走都不重要了,现在的问题是:谁把这个棋盘上的格子损坏了?”
如下图所示,有一正方形棋盘,其边长为2k(1<k<10),其中有一格损坏。现在想用下图中间所示形状的硬纸板将没有坏的所有格子盖起来。而硬纸板不得放入坏格中和棋盘外面。编程输出一种覆盖方案,将共用一块硬纸板的三个格子用相同的数字表示。
上图所示是k=2的情形,且输出结果不一定和图示方案一致,符合题目要求即可,输出时只需输出数字方阵而不必画出格子线。
输入
三个整数,即k和坏格子的y坐标、x坐标(注意坏格子的坐标输入顺序)
输出
数字方阵,其中坏坐标以数字7表示(行尾有一个空格)
样例输入
2 1 1
样例输出
7 4 2 2 4 4 4 2 3 4 4 4 3 3 4 4 先从整体上找到方位偏移,在图形中间加对应模板,之后继续对每一片区域四分,再对应去找相对的模板去覆盖,有递归思想
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include <climits>
#include<queue>
#include<vector>
#include <string.h>
#include <math.h>
#include<map>
#include<string.h>
#define ll long long
using
namespace
std;
int
pic[1200][1200];
void
cover(
int
x0,
int
y0,
int
x,
int
y,
int
t)
{
int
k=t;
if
(t!=0)
{
if
((x>=k+x0)&&(y>=k+y0))
//you xia
{
pic[k+x0-1][k+y0]=1;
pic[k+x0-1][k+y0-1]=1;
pic[k+x0][k+y0-1]=1;
cover(x0,y0,k+x0-1,k+y0-1,k/2);
cover(x0,y0+k,x0+k-1,y0+k,k/2);
cover(x0+k,y0,x0+k,k+y0-1,k/2);
cover(k+x0,k+y0,x,y,k/2);
}
else
if
((x>=k+x0)&&(y<k+y0))
//zuo xia
{
pic[k+x0-1][k+y0-1]=2;
pic[k+x0-1][k+y0]=2;
pic[k+x0][k+y0]=2;
cover(x0,y0,k+x0-1,k+y0-1,k/2);
cover(x0,k+y0,k+x0-1,k+y0,k/2);
cover(x0+k,y0+k,x0+k,y0+k,k/2);
cover(k+x0,y0,x,y,k/2);
}
else
if
((x<k+x0)&&(y>=k+y0))
{
pic[k+x0-1][k+y0-1]=3;
pic[k+x0][k+y0-1]=3;
pic[k+x0][k+y0]=3;
cover(x0,y0,k+x0-1,k+y0-1,k/2);
cover(k+x0,y0,k+x0,k+y0-1,k/2);
cover(k+x0,k+y0,k+x0,k+y0,k/2);
cover(x0,k+y0,x,y,k/2);
}
else
{
pic[k+x0-1][k+y0]=4;
pic[k+x0][k+y0-1]=4;
pic[k+x0][k+y0]=4;
cover(x0,y0,x,y,k/2);
cover(k+x0,y0,k+x0,k+y0-1,k/2);
cover(x0,k+y0,k+x0-1,k+y0,k/2);
cover(k+x0,k+y0,k+x0,k+y0,k/2);
}
}
}
int
main()
{
//freopen("in.txt","r",stdin);
int
k,x,y,cnt=1;
scanf
(
"%d %d %d"
,&k,&x,&y);
pic[x][y]=7;
for
(
int
i=1;i<=k;i++)
{
cnt*=2;
}
cover(1,1,x,y,cnt);
for
(
int
i=1;i<=cnt;i++)
{
for
(
int
j=1;j<=cnt;j++)
{
printf
(
"%d "
,pic[i][j]);
}
printf
(
"\n"
);
}
return
0;
}