洛谷 P1498 南蛮图腾
JDOJ 1325: VIJOS-P1167 南蛮图腾
Description
自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果(看Hint),在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?
Input
每个数据一个数字,表示图腾的大小(此大小非彼大小) n< =10
Output
这个大小的图腾
Sample Input
2
Sample Output
/ / / / //__
HINT
N=3时的样子
/
/__
/ /
/__/__
/ /
/__ /__
/ / / /
/__/__/__/__
其实这是一个分形图,效果如下:
Source
最优解声明
题解:
(扒一下大佬的思路)(太清奇了)
我们看一下杨辉三角(对2取模后版本)
1
1 1
1 0 1
1 1 1 1
1 0 0 0 1
1 1 0 0 1 1
1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 1
1 1 0 0 0 0 0 0 1 1
1 0 1 0 0 0 0 0 1 0 1
1 1 1 1 0 0 0 0 1 1 1 1
1 0 0 0 1 0 0 0 1 0 0 0 1
我们发现这个东西和题目要求输出的东西很像。
所以我们突发奇想,进行进一步思考:
我们可以考虑用二维数组来存这个杨辉三角,但是会浪费很多无用的空间,所以我们可以用一维数组搞定,每行的开头元素在数组中的编号是(2^k)(从0开始编号)。
然后开始找规律:
奇数行碰到一就可以输出"/ ",偶数行如果有连续两个1就输出"/__ "。遇0就补空格。
总之,以上的思路可以用一句话概括:乱搞+找规律。
所以我都不知道把它放到什么分类好了。
还是附上代码吧,可读性比较强:
#include<cstdio>
using namespace std;
int n,a[1030]={1};
int main()
{
scanf("%d",&n);
for(int i=0;i<1<<n;++i)
{
for(int j=1;j<(1<<n)-i;++j)
printf(" ");
for(int j=i;j>=0;--j)
a[j]^=a[j-1];
if(!(i%2))
for(int j=0;j<=i;++j)
{
if(a[j])
printf("/\");
else
printf(" ");
}
else
for(int j=0;j<=i;j+=2)
{
if(a[j])
printf("/__\");
else
printf(" ");
}
puts("");
}
return 0;
}