洛谷P5461题解

题目传送门: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 }

猜你喜欢

转载自www.cnblogs.com/-YueYang-/p/12731096.html