题目
现有2n×2n(n≤10) 名作弊者站成一个正方形方阵等候kkksc03的发落。kkksc03决定赦免一些作弊者。他将正方形矩阵均分为4个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下3个小矩阵中,每一个矩阵继续分为4个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。
给出n,请输出每名作弊者的命运,其中0代表被赦免,1代表不被赦免。
输入输出格式
输入格式
一个整数n。
输出格式
的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。
输入输出样例
输入样例
3
输出样例
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
代码
//经典的递归套路的代码,遇到反复相同的操作过程,使用递归
#include<iostream>
using namespace std;
int n,a[1050][1050],p=1;
void bianhua(int x,int l,int h){//x为正方形边长,l、h分别为递归正方形的横纵坐标if(x==2){//终止条件a[l][h]=0;return;}//具体操作for(int i=l;i<=l+x/2-1;i++){for(int j=h;j<=h+x/2-1;j++){a[i][j]=0;}}//其余部分操作完成bianhua(x/2,l,h+x/2);bianhua(x/2,l+x/2,h);bianhua(x/2,l+x/2,h+x/2);
}
int main(){cin>>n;for(int i=1;i<=n;i++){p*=2;}for(int i=1;i<=p;i++){for(int j=1;j<=p;j++){a[i][j]=1;}}bianhua(p,1,1);//递归for(int i=1;i<=p;i++){for(int j=1;j<=p-1;j++){cout<<a[i][j]<<" ";}cout<<a[i][p]<<endl;//避免最后多打一个空格,最后一列单独处理}return 0;
}