列表

详情


NC200628. 小李堆积木

描述

有一天小爸爸老李送了个积木给小玩,积木里面就分两种,黑白方块,老李给了小一个任务,这里给出图形堆的规则
第一阶段
1
第二阶段
1 1
0 1
第三阶段
1 1 1 1 
0 1 0 1
0 0 1 1
1 0 0 1

. . .等
规则是:
分为四个部分
1 | 1
——
0 | 1
左1  右1   右2   都是和 n-1阶段相同
左2 和 n-1阶段相反 
然后老李想要知道第n阶段是什么

输入描述

第一行  输入一个t,代表数据组数(1<=t<=10)
第二行 输入一个n,代表要求第n阶段是什么(1<=n<=10)

输出描述

下面t组数据,分别输出第n阶段的积木堆的情况

示例1

输入:

3
1
2
3

输出:

1
1 1
0 1
1 1 1 1 
0 1 0 1
0 0 1 1
1 0 0 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 49ms, 内存消耗: 5216K, 提交时间: 2020-01-05 16:41:51

#include<iostream>
#include<cmath>
using namespace std;
int num[1025][1025];
void creat(int x) {
	int xx=pow(2,x-1);
	int yy=xx;
	for(int i=1;i<=xx;i++) {
		for(int j=1;j<=yy;j++) {
			num[i][yy+j]=num[i][j];
			num[xx+i][yy+j]=num[i][j];
			if(num[i][j]) num[xx+i][j]=0;
			else num[xx+i][j]=1;
		}
	}
} 
int main() {
	num[1][1]=1;
	num[1][2]=1;
	num[2][1]=0;
	num[2][2]=1;
	for(int i=2;i<=10;i++) {
		creat(i);
	}
	int t;
	cin>>t;
	while(t--) {
		int n;
		cin>>n;
		int len=pow(2,n-1);
		for(int i=1;i<=len;i++) {
			for(int j=1;j<=len;j++) {
				if(j>1) printf(" ");
				printf("%d",num[i][j]);
			}
			printf("\n");
		}
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 80ms, 内存消耗: 17504K, 提交时间: 2020-01-08 22:02:19

#include<bits/stdc++.h>
#define rep(i,s,e) for(int i=s; i<e; ++i)
using namespace std;
int a[2050][2050];
int main(){
	a[0][0]=1; rep(i,0,11){ int m=1<<i;
		rep(j,0,m) rep(k,0,m){
			a[j][k+m]=a[j+m][k+m]=a[j][k]; a[j+m][k]=!a[j][k];
		}
	}
	int _; cin>>_; while(_--){
		int n; cin>>n; n--; int m=1<<n; rep(i,0,m) rep(j,0,m) cout<<a[i][j]<<(char)(j==m-1?'\n':' ');
	}
}

上一题