#1819. 南蛮图腾

南蛮图腾

提示

n=1n=1 的图案如下所示

 /\
/__\

可以发现 n=2n=2 的图案是由三个 n=1n=1 构成的,n=3n=3 的图案是由三个 n=2n=2 构成的。

每一部分的图案仅仅只是位置不同而已,图案的形状是完全一样的,我们可以考虑使用递归分解这个问题来解决。

首先我们需要规定出图案的位置,这里可以表示左下角 / 的位置记为 x,yx,y

则其余位置分别是

 /\
/__\
  • 左下的 /: (x,y)(x, y)
  • 左上的 /: (x1,y+1)(x-1, y+1)
  • 右上的 \: (x1,y+2)(x-1, y+2)
  • 右下的 \: (x,y+3)(x, y+3)
  • 左边的 _: x,y+1x,y+1
  • 右边的 _: x,y+2x,y+2

观察 n=3n=3 的图案。

       /\
      /__\
     /\  /\
    /__\/__\
   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

它是由 33n=2n=2 的图案构成的。

可以发现每个 n=2n=2 的图案位置如下所示。我们设置一个递归函数,其一共有三个函数如下所示

void f(int n, int x, int y)

其中 nn 为问题规模,x,yx,y 为图案左下的位置。

image

递归方程

  • 左下部分可以分解为 f(n1,x,y)f(n - 1,x,y) 来处理。
  • 右边部分可以分解为 f(n1,x,y+2n)f(n-1,x,y+2^n) 来处理。
  • 上边部分可以分解为 f(n1,x2n1,y+2n1)f(n-1,x-2^{n-1},y+2^{n-1}) 处理。

递归边界

n=1n=1 的时候,我们按照

  • 左下的 /: (x,y)(x, y)
  • 左上的 /: (x1,y+1)(x-1, y+1)
  • 右上的 \: (x1,y+2)(x-1, y+2)
  • 右下的 \: (x,y+3)(x, y+3)
  • 左边的 _: x,y+1x,y+1
  • 右边的 _: x,y+2x,y+2

这六点把坐标设置好即可。

主函数 int main() 内部

在主函数中,我们从最左下角的 / 开始递归。

最左下角的 / 的坐标是 (2n,1)(2^n,1)

即调用 f(n,2n,1)f(n,2^n,1) 开始递归。

将所得的图案保存到一个char 类型的二维数组中,最后输出整个数组的值即可。

题目描述

给定一个正整数 nn,参考输出样例,输出图形。

输入格式

每个数据输入一个正整数 nn,表示图腾的大小(此大小非彼大小)

输出格式

这个大小的图腾

2
   /\
  /__\
 /\  /\
/__\/__\
3
       /\
      /__\
     /\  /\
    /__\/__\
   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

提示

数据保证,1n101 \leq n \leq 10