▲ 有个重要的思想:为了达成分治的目的,要在没有真正特殊点的子棋盘内假设一个特殊点,以此出发才能继续分治
▲ 此外,注意到在不同层函数(即不同大小的棋盘)之间,L型块编号应是递增的,但在同一层函数中,L型块的编号不变(执行完一层函数,才是完全地填完了同一个L型块)。要达到这样的效果,只需让n在函数递归的过程中递增,而函数内部 int t=n,确保同一层函数中同一个L型块的各个格子编号都相同
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int map[1000][1000];
int k,x,y,n=0;
int g;
void chess(int kx,int ky,int sx,int sy,int size){
if(size==1) return;
n++;
int t=n;
/*for(int i=1;i<=g;i++){
for(int j=1;j<=g;j++){
printf("%-3d ",map[i][j]);
}
printf("\n");
}
printf("\n");
*/
int s=size/2;
//左上角棋盘
if(sx<kx+s&&sy<ky+s) chess(kx,ky,sx,sy,s);
else{
//覆盖右下角格子,并令其为特殊点
map[kx+s-1][ky+s-1]=t;
chess(kx,ky,kx+s-1,ky+s-1,s);
}
//右上角棋盘
if(sx<kx+s&&sy>=ky+s) chess(kx,ky+s,sx,sy,s);
else{
//覆盖左下角格子,并令其为特殊点
map[kx+s-1][ky+s]=t;
chess(kx,ky+s,kx+s-1,ky+s,s);
}
//左下角棋盘
if(sy<ky+s&&sx>=kx+s) chess(kx+s,ky,sx,sy,s);
else{
map[kx+s][ky+s-1]=t;
chess(kx+s,ky,kx+s,ky+s-1,s);
}
//右下角棋盘
if(sx>=kx+s&&sy>=ky+s) chess(kx+s,ky+s,sx,sy,s);
else{
map[kx+s][ky+s]=t;
chess(kx+s,ky+s,kx+s,ky+s,s);
}
}
int main(){
cin>>k>>x>>y;
g=pow(2,k);
chess(1,1,x,y,g);
for(int i=1;i<=g;i++){
for(int j=1;j<=g;j++){
printf("%d ",map[i][j]);
}
printf("\n");
}
return 0;
}