U (21). 爸爸请给我零花钱
题目描述
神楽めあ个人势 VTuber,曾从属于画师 Paryi 的虚拟 YouTuber 团体 Project Paryi(ぱりぷろ),现已解散。 自称清楚系 Vtuber,然而在初配信中说出了大量问题发言, 是所谓的恶俗系主播。 第二次推特意外被冻结和随后被炎上的事件后屑营业逐渐减 少。 与 2019 年 10 月 12 日 11 点 18 分(远东标准时间 UTC+9)在 直播中突破 10 万粉丝。 其粉丝被称为财布,并且她又在最近的直播中与直播间的财 布们互动,财布们打赏会被 mea 叫爸爸,一时间打赏不断。
小 m 也想打赏 mea,但是自己的财布似乎没有这么厚,于是 他想画一幅话送给 mea。小 m 也是一位学计算机的学生,他想 用他最熟悉的 console 画一幅字符串$堆砌的画,你能帮帮他 吗? 初始的美金符号如下
-----|-----
| |
| |
| |
-----|-----
| |
| |
| |
-----|-----
由-和|组成,堆砌的美金为三角形,详情请看样例
输入描述
输入包含多组测试数据。 第一行一个正整数 T (1≤T≤8]) 代表测试数据组数。
每个测试数据一个正整数 n (1≤n≤8)代表是第几幅画。
输出描述
对于每组测试数据,输出对应的画。
样例
输入
2
2
3
输出
-----|-----
| |
| |
| |
-----|-----
| |
| |
| |
-----|-----
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
-----|-----
| |
| |
| |
-----|-----
| |
| |
| |
-----|-----
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
| | | |
| | | |
| | | |
-----|----- -----|-----
-----|----- -----|----- -----|----- -----|-----
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----|----- -----|----- -----|----- -----|-----
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----|----- -----|----- -----|----- -----|-----
提示
所有的画都与前一幅的画有关,都是由前一幅的画上面一 个下面两个按照格式堆砌而成的。
//分析:
/*
将每个
-----|-----
| |
| |
| |
-----|-----
| |
| |
| |
-----|-----
看作一个小单元
所以对应单个n,需要输出2^(n-1)行,每行输出单元数为2^(i-1);
我们通过补充空格的方式来使小单元与下级单元对齐
用一个数组来标记输出状态,借助^从逆序改变状态
*/
#include<bits/stdc++.h>
using namespace std;
int a[1200]= {0,1};//状态数组,0=不输出,补空格 1=输出
int n,T;
string s[10]= {"-----|----- ","| | ","| | ","| | ","-----|----- "," | |"," | |"," | |","-----|----- "};//存入数据
void solve() {
memset(a,0,sizeof a);
a[1]=1;//初始化
cin>>n;
n--;//n=n-1
for(int i=1; i<=1<<n; ++i) {//行数
for(int j=i; j>=1; --j)
a[j]^=a[j-1];//改变输出状态
for(int j=0; j<9; j++) {//图形
for(int k=1; k<=(1<<n)-i; k++)
cout<<" ";//输出前导空格,一个单元长度为12,半个单元是6
for(int k=1; k<=i; k++)//输出
if(a[k]==1){
cout<<s[j];//输出图形
if(k!=i)
cout<<" ";//格式错误点1
}
else
cout<<" ";//补空格
for(int k=1; k<=(1<<n)-i; k++)
cout<<" ";//格式错误点2,输出后导空格
cout<<"\n";
}
}
}
int main() {
cin>>T;
while(T--)
solve();
return 0;
}