爸爸请给我零花钱 (位运算+递推)

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;
}

打表文件:(1条消息) 关于拿到后台数据后仍然不能解决问题这件事资源-CSDN文库

同类题:LUOGU传送门

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panjyash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值