标签:
#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