题目
![在这里插入图片描述](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;
}