#include<iostream>
#include<iomanip>
using namespace std;
#define M 10000
int map[M][M];
int bad;
void fill(int stx,int sty,int size,int x,int y)
{
int i,j;
if(size==2)
{
bad=bad+1;
for(i=stx;i<=stx+size-1;i++)
for(j=sty;j<=sty+size-1;j++)
if(map[i][j]==-1)
map[i][j]=bad;
return ;
}
size=size/2;
bad=bad+1;
int temp=bad;//尤其注意此局部变量的使用,每次调用fill函数就意味着用一个新的L型板子,bad可以区分各个板子
//如果不适用一个局部变量,fill过程类似深搜每搜索一次bad+1,那么对同一块板子其他格子赋值出错
if(x<=stx+size-1&&y<=sty+size-1)
fill(stx,sty,size,x,y);
else {
map[stx+size-1][sty+size-1]=temp;
fill(stx,sty,size,stx+size-1,sty+size-1);
}
if(x<=stx+size-1&&y>=sty+size)
fill(stx,sty+size,size,x,y);
else {
map[stx+size-1][sty+size]=temp;
fill(stx,sty+size,size,stx+size-1,sty+size);
}
if(x>=stx+size&&y<=sty+size-1)
fill(stx+size,sty,size,x,y);
else {
map[stx+size][sty+size-1]=temp;
fill(stx+size,sty,size,stx+size,sty+size-1);
}
if(x>=stx+size&&y>=sty+size)
fill(stx+size,sty+size,size,x,y);
else {
map[stx+size][sty+size]=temp;
fill(stx+size,sty+size,size,stx+size,sty+size);
}
}
int main()
{
int n,len,x,y,i,j;
cin>>n;
while(n--)
{
cin>>len>>x>>y;
bad=0;
for(i=1;i<=len;i++)
for(j=1;j<=len;j++)
map[i][j]=-1;
map[x][y]=0;
fill(1,1,len,x,y);
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
cout<<setw(3)<<map[i][j];
cout<<endl;
}
}
return 0;
}


原文:http://blog.csdn.net/killer_in_silence/article/details/44021253