题目意思很明确了,经典给定一个数,输出对应大小的图形
通过观察我们不难可以确定当n=1时,图形长这样
/\ /__\
对比n=1时和n=2时的图形,可知n=2的图形是由n=1的图形组成的分别是上、左下、右下三个位置,结合n=3和n=2的图形也可看出这点(到这里其实就意识到是递归了,递归终点就是n=1时,虽然意识到了,动手写还是有难度),这里我选择使用一个合适大小的char数组,并且全部初始化为空格,只在需要 斜杆 反斜杠 下划线 的地方进行修改即可
观察发现每次画的上面的三角形第一个‘/’的位置下标是(1,2^n)(数组下标从1开始),而刚好左下角的三角形的第一个‘/’的位置下标是(x+2^n-1,y-2^n-1)
同理右下角的三角形的第一个‘/’的位置下标是(x+2^n-1,y+x^n-1)
上面的(x,y)是上三角形的第一个“/”的位置下标
#include<iostream>
#include<cmath>
using namespace std;
int n;
char arr[1030][2050];
void fun(int x,int y,int n) {//(x,y)为第一个'/'的下标
if (n == 1) {
arr[x][y] = '/';
arr[x][y + 1] = '\\';
arr[x + 1][y - 1] = '/';
arr[x + 1][y] = arr[x + 1][y + 1] = '_';
arr[x + 1][y + 2] = '\\';
}
else {
//分别用n-1的图形画出上左右三个图形组成n的图形
fun(x, y, n - 1);//上
fun(x + pow(2, n - 1), y - pow(2, n - 1), n - 1);//左下
fun(x + pow(2, n - 1), y + pow(2, n - 1), n - 1);//右下
}
}
int main()
{
cin >> n;
int len1 = pow(2, n), len2 = pow(2, n + 1);
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
arr[i][j] = ' ';//初始化
}
}
fun(1, pow(2, n), n);
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
cout << arr[i][j];
}
cout << endl;
}
return 0;
}