P1498 南蛮图腾

题目出处:

南蛮图腾 - 洛谷

题目内容:

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

输入格式

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

输出格式

这个大小的图腾

输入

2

输出

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

输入

3

输出

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

数据规模与约定

对于 100% 的数据,保证 1<= n <= 10。

思路:分治 递归

我们可以发现题目输出格式有重复出现的基础图案(子问题),考虑用分治+递归来解决。

以下是n=2的情况:

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

以下n=3的情况:

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

可见第n个图形的形成可以看作是第n-1个图形的堆叠(三个叠成三角),体现了递归思想。

只需每次执行矩阵的如上移动即可:

a[j+column][k]=a[j+column][k+row]=a[j][k];//让下面一层建好(三角形结构递归)。

a[j][k]=' ';//删去第n-1次(上层递归)的残留。

 a[j][k+row/2]=a[j+column][k];//补回三角形递归的上顶角(最后补防止误删)。

而所有的图案由最小的图形组合(n=1)。

 /\  
/__\

注意:‘\’中的\是后面的字符进行转义,想要在终端显示\需要打‘\\’。

AC代码

#include<bits/stdc++.h>
using namespace std;

char a[2050][2050]; 
int main()
{
    int n,i,j,k,l; cin>>n;
    int column=2,row=4;

    memset(a,' ',sizeof(a));
    a[1][3]=a[2][4]='\\';
    a[1][1]=a[1][4]=' ';
    a[1][2]=a[2][1]='/';
    a[2][2]=a[2][3]='_';//n=1时。

    for(i=1;i<n;i++)
    {
        for(j=1;j<=column;j++)
            for(k=1;k<=row;k++)
            {
                a[j+column][k]=a[j+column][k+row]=a[j][k];//让下面一层建好(三角形结构递归)。
                a[j][k]=' ';
            }   

        for(j=1;j<=column;j++)
            for(k=1;k<=row;k++)
                a[j][k+row/2]=a[j+column][k];
            
        column*=2; row*=2;
    }
         

    for(i=1;i<=column;i++)
    {
        for(j=1;j<=row;j++)
            cout<<a[i][j];   
        cout<<endl;
    }
    return 0;
}

谢谢。😘

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值