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

来源:互联网 发布:淘宝助理在哪下载安装 编辑:程序博客网 时间:2024/05/21 09:24

问题 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 longusing 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);    }}
阅读全文
0 0