问题 D: 简单的图形输出
时间限制: 1 Sec 内存限制: 30 MB
提交: 526 解决: 103
[提交][状态][讨论版]
题目描述
谢尔宾斯基三角形是一种分形,它的构造过程是这样的:
1.取一个实心的三角形。(多数使用等边三角形)
2.沿三边中点的连线,将它分成四个小三角形。
3.去掉中间的那一个小三角形。
4.对其余三个小三角形重复1。
我们想尝试用斜线、反斜线和下划线画出谢尔宾斯基三角,假设最小的三角是长这样的:
/\
/__\
具体规律详见样例。
输入
多组数据输入输出。每行有一个整数n(1<=n<=10),表示执行了一次操作1,n=0时结束输入。
输出
画出执行n次操作1后的图形,调整你的输出到最左端(底边的第一个斜杠在第一列)。输出不能包含任何尾随空格。在每个测试用例后打印空行。
样例输入
3
2
1
0
样例输出
/\
/__\
/\ /\
/\/\
/\ /\
/\ /\
/\ /\ /\ /\
/\/\/\/\
/\
/__\
/\ /\
/\/\
/\
/__\
题解:原图形较复杂的分形,还是分形的基本做法。确定位置,确定改变量的大小。剩下都是套路。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<map>
#include<vector>
#include<string.h>
#define ll long long
using namespace std;
const int N = 1e6+7;
const int MOD = 1e9+7;
char a[3333][3333];
int pow(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans*=x;
x*=x,y>>=1;
}
return ans;
}
int n;
void dfs(int cnt,int x,int y)
{
if(cnt==1)
{
a[x][y]='/';
a[x][y+1]='\\';
a[x+1][y-1]='/';
a[x+1][y]='_';
a[x+1][y+1]='_';
a[x+1][y+2]='\\';
return ;
}
int sz=pow(2,cnt-1);
dfs(cnt-1,x,y);
dfs(cnt-1,x+sz,y-sz);
dfs(cnt-1,x+sz,y+sz);
}
int main()
{
bool flag=false;
while(cin>>n)
{
if(flag)puts("");
flag=true;
if(n==0) break;
memset(a,' ',sizeof(a));
int l=pow(2,n);
int r=pow(2,n+1);
dfs(n,1,l);
for(int i=1;i<=l;i++)
{
for(int j=r;j;j--)
{
if(a[i][j]!=' ')
{
a[i][j+1]='\0';
break;
}
}
}
for(int i=1;i<=l;i++) puts(a[i]+1);
}
}