其实这个题目拿到手的时候我是懵的,我不知道怎么写,后来看了别人的代码,明白了思想再去写的,其实他就是一个分治的思想,把棋盘分成四个部分,依次递归,四个部分的每个部分都要判断那个特殊点是不是在这个部分内,然后依次递归。
题目如下:
有一个2^k*2^k的正方形棋盘,在其内部有一个特殊方格标记为0,现在要用L形状的骨牌来覆盖除了特殊方格外的全部期盼,骨牌可以任意旋转但不能重叠。
输入有两行,第一行是棋盘的大小,第二行是特殊值的位置。
代码如下:
#include<stdio.h>
int a[100][100];
int jishu=0;
void chazhao(int hang,int lie,int x,int y,int k)
{
if(k==1){//一定要有的条件
return;
}
int l,n;
l=k/2;
jishu++;
n=jishu;
if(hang+l>x&&lie+l>y)//左上
chazhao(hang,lie,x,y,l);
else
{
a[hang+l-1][lie+l-1]=n;
chazhao(hang,lie,hang+l-1,lie+l-1,l);
}
if(hang+l>x&&lie+l<=y)//右上
chazhao(hang,lie+l,x,y,l);
else
{
a[hang+l-1][lie+l]=n;
chazhao(hang,lie+l,hang+l-1,lie+l,l);
}
if(hang+l<=x&&lie+l>y)//左下
chazhao(hang+l,lie,x,y,l);
else
{
a[hang+l][lie+l-1]=n;
chazhao(hang+l,lie,hang+l,lie+l-1,l);
}
if(hang+l<=x&&lie+l<=y)//右下
chazhao(hang+l,lie+l,x,y,l);
else
{
a[hang+l][lie+l]=n;
chazhao(hang+l,lie+l,hang+1,lie+l,l);
}
}
void main()
{
int k,x,y;
scanf("%d%d%d",&k,&x,&y);
chazhao(0,0,x,y,k);
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
注意左上右上左后右后的顺序不能反,如果反了话就要改条件。