P1498 南蛮图腾(递归)

 题目传送门

题目意思很明确了,经典给定一个数,输出对应大小的图形

通过观察我们不难可以确定当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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZZZWWWFFF_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值