P5461 赦免战俘题解

题目

现有2n×2n(n≤10) 名作弊者站成一个正方形方阵等候kkksc03的发落。kkksc03决定赦免一些作弊者。他将正方形矩阵均分为4个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下3个小矩阵中,每一个矩阵继续分为4个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。

给出n,请输出每名作弊者的命运,其中0代表被赦免,1代表不被赦免。

输入输出格式

输入格式

一个整数n。

输出格式

2^{n}\times 2^{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
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<

你可能感兴趣的:(C++,算法题目题解,算法,c++)