题目传送门:https://www.luogu.com.cn/problem/P5461
分析题目,很明显有递归的性质,代码也很简单,简单模拟+递归。
具体解释见代码注释。
code:
1 #include<iostream> 2 using namespace std; 3 int n; 4 int num[15]={1,2,4,8,16,32,64,128,256,512,1024};//打一张2的次方表 5 int sum[2000][2000]; 6 void work(int x1,int y1,int x2,int y2,int flag,int len){//x1,y1是左上角坐标,x2,y2是右下角坐标,flag表示是(0)不是(1)这个区域全零,len是这个区域的边长。(其实有了len就不需要x2y2了) 7 if(flag==0)return;//如果是全零,就不要做了,因为sum初值就为0 8 if(len==1){ 9 sum[x1][y1]=1; 10 return; 11 }//如果这个区间边长为1并且不是全零,就赋1 12 work(x1,y1,x2-len/2,y2-len/2,0,len/2);//左上角区间,是全零的 13 work(x1,y1+len/2,x2-len/2,y2,1,len/2);//下面都是需要再次递归的区间 14 work(x1+len/2,y1,x2,y2-len/2,1,len/2); 15 work(x1+len/2,y1+len/2,x2,y2,1,len/2); 16 } 17 int main(){ 18 cin>>n;n=num[n];//2的n次方 19 work(1,1,n,n,1,n); 20 for(int i=1;i<=n;++i){ 21 for(int j=1;j<=n;++j)cout<<sum[i][j]<<" "; 22 cout<<endl; 23 }//输出 24 return 0; 25 }