您的位置:首页 > 理论基础 > 计算机网络

第四届“图灵杯”NEUQ-ACM程序设计竞赛(团队赛)-网络同步赛D 分形

2017-06-14 21:17 309 查看
问题 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

样例输出

/\

/__\

/\ /\

/\/\

/\ /\

/\ /\

/\ /\ /\ /\

/\/\/\/\

/\

/__\

/\ /\

/\/\

<
4000
p>/\

/__\

题解:原图形较复杂的分形,还是分形的基本做法。确定位置,确定改变量的大小。剩下都是套路。

#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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐