热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ1941三角形分形

TheSierpinskiFractalTimeLimit:1000MSMemoryLimit:3
The Sierpinski Fractal
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 2684   Accepted: 1240

Description

Consider a regular triangular area, divide it into four equal triangles of half height and remove the one in the middle. Apply the same operation recursively to each of the three remaining triangles. If we repeated this procedure infinite times, we'd obtain something with an area of zero. The fractal that evolves this way is called the Sierpinski Triangle. Although its topological dimension is 2, its Hausdorff-Besicovitch dimension is log(3)/log(2)~1.58, a fractional value (that's why it is called a fractal). By the way, the Hausdorff-Besicovitch dimension of the Norwegian coast is approximately 1.52, its topological dimension being 1.

For this problem, you are to outline the Sierpinski Triangle up to a certain recursion depth, using just ASCII characters. Since the drawing resolution is thus fixed, you'll need to grow the picture appropriately. Draw the smallest triangle (that is not divided any further) with two slashes, to backslashes and two underscores like this:
 /\
/__\

To see how to draw larger triangles, take a look at the sample output.

Input

The input contains several testcases. Each is specified by an integer n. Input is terminated by n=0. Otherwise 1<=n<=10 indicates the recursion depth.

Output

For each test case draw an outline of the Sierpinski Triangle with a side's total length of 2 n characters. Align your output to the left, that is, print the bottom leftmost slash into the first column. The output must not contain any trailing blanks. Print an empty line after each test case.

Sample Input

3
2
1
0

Sample Output

       /\
      /__\
     /\  /\
    /__\/__\
   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

   /\
  /__\
 /\  /\
/__\/__\

 /\
/__\

Hint


The Sierpinski-Triangle up to recursion depth 7

 



三角形分形


思路:
将整个图案考虑成一个矩形,矩形长为4*2^(size-1),宽为2^size,
然后按行枚举矩形内每一个点,判断是哪个字符并输出。


此题的关键在于如何判断大小为size图形的i行j列是哪个字符,
考虑到大小为n的图形是由3个大小为size-1的图形构成,那么
可以将size图形中的(i,j)坐标转化为size-1图形中对应的坐标,
转化关系如下:

 

1:
当i <2^(size-1) 并且 j >= 2^(size-1) 并且 j <3*2^(size-1)时
在size-1图形中对应的坐标为(i ,j-2^(size-1) )

2:
当 i >= 2^(size-1) 并且 j <2^size时
在size-1图形中对应的坐标为(i-2^(size-1) ,j)

3:
当 i >= 2^(size-1) 并且 j >= 2^size时
在size-1图形中对应的坐标为(i-2^(size-1) ,j-2^size)

 

画图举个例子:

例如计算size为3时6行9列的字符,过程如下:

1:
判断得到该坐标点在右下方的大小为2的图形中,将(6,9)
点转化为size为2的坐标系坐标(2,1)

2:
判断(2,1)点在左下方大小为1的图形中,将(2,1)点
转化为size为1的坐标系坐标(0,1)

3:
返回size为1图形的(0,1)点的字符

 

#include 
#include 
using namespace std;

#define EASY 0

int mul[13];
char map[][10] = {" /\\ " ,"/__\\"};

void get_pow()
{
	int i ,r;
	mul[0] = 1;
	for(r = 1 ,i = 1 ; i <13 ;i ++)
	{
		r *= 2;
		mul[i] = r;
	}
}

inline
int mpow(int a ,int b)
{
	return mul[b];
}

char get_out(int size ,int i, int j)
{
	char r = ' ';
	int m = mul[size-1];
	if(size == 1)
	{
		return map[i][j];
	}

#if 0 == EASY
	//未化简版
	if(i = 4*mpow(2 ,size-2)/2 && j <4*mpow(2 ,size-2)/2*3)
		r = get_out(size-1 ,i ,j - 4*mpow(2 ,size-2)/2);
	else if(i >= mpow(2 ,size-1) && j <4*mpow(2 ,size-2))
		r = get_out(size-1 ,i - mpow(2 ,size-1) ,j );
	else if(i >= mpow(2 ,size-1) && j >= 4*mpow(2 ,size-2))
		r = get_out(size-1 ,i - mpow(2 ,size-1) ,j - 4*mpow(2 ,size-2));
#else
	//化简版
	if(i = m && j <(m<<1)+m)
		r = get_out(size-1 ,i ,j - m);
	else if(i >= m && j =m && j >= 2*m)
		r = get_out(size-1 ,i - m ,j - 2*m);
#endif

	return r;
}

int main()
{
	int i ,j ,size ,k;

	get_pow();
	while(cin>>size && 0 != size)
	{
		for(i = 0 ;i  
 


 

 


推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 解决Expo XDE 2.22.1版本启动错误
    根据问题描述,用户在将Expo升级至2.22.1版本后,在尝试打开项目时遇到了错误。本文提供了详细的错误分析及解决方案。 ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
author-avatar
mobiledu2502897817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有