题目出处:
南蛮图腾 - 洛谷
题目内容:
给定一个正整数 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;
}
谢谢。😘