【03yy and triangle】

03yy and triangle

题目

在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/63bc394e4657496caddfd817794cf5e6.png

解法

Java

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //根据计算,当n为10的时候 数组需要的空间最大为2^10=1024 此处取1030
        String[] str = new String[1030];
        str[0] = " /\\";
        str[1] = "/__\\";
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //当n为1时,可直接输出,否则进入动态规划循环,从2开始填充数组
        for (int i = 2; i <=n ; i++) {
            print(i,str);
        }
        //最后输出数组的所有内容 每次输出一行,输出后进行自动换行
        for (int i = 0; i <= (1<<n) -1; i++) {
            System.out.println(str[i]);
        }
    }
    //n表示当前进行排序的层次
    public static void print(int n,String[] str){
        //cur表示起始行
        int cur = 1<<(n-1);
        //从指定当前 n 的最底层开始构造
        for (int j = (1<<n) -1; j >= cur ; j--) {
            //最底层对应 应该复制的层次
            str[j] = str[j -cur];
            //行之间的差距决定了空格的数量
            for (int k = 1; k < (1<<n) -j ; k++) {
                str[j] +=" ";
            }
            //每次递增两倍
            str[j] += str[j -cur];
        }
        String temp;
        //每次给前面的层次添加空格
        for (int j = cur -1; j >= 0 ; j--) {
            temp ="";
            for (int k = 1; k <=cur; k++)
                temp +=" ";
            str[j] = temp +str[j];

        }
    }
}

C++

#include<iostream>
#include<string.h>
using namespace std;
string sj[1024] = {" /\\", "/__\\"};

void dfs(int n){
	int step = (1<<n-1);
	for(int i=2*step-1; i>=step; --i){
		sj[i] = sj[i-step];
		for(int j=1; j<2*step-i; j++) sj[i]+=" ";
		sj[i] += sj[i-step];
	}
	string tmp;

	for(int i=step-1; i>=0; --i){
		tmp = "";
		for(int j=1; j<=step; j++) tmp+=" ";
		sj[i] = tmp + sj[i];
	}
}

int main(){
	int n;
	cin>>n;
	
	for(int i=2; i<=n; i++) dfs(i);
	
	for(int i=0; i<=(1<<n)-1; ++i){
		cout<<sj[i]<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值