Fractal | |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB | |
Problem description | |
| |
Input | |
The input consists of several test cases. Each line of the input contains a positive integer n which is no greater than 7. The last line of input is a negative integer −1 indicating the end of input. | |
Output | |
For each test case, output the box fractal using the 'X' notation. Please notice that 'X' is an uppercase letter. Print a line with only a single dash after each test case. be careful, no extra blankspace allowed in the output. | |
Sample Input | |
1 2 3 4 -1 | |
Sample Output | |
X - X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X - | |
Problem Source | |
Shanghai-P 2004 | |
Submit Discuss Judge Status Problems Ranklist 一、解题思路 读完题目先确定需要用到递归,然后我就想一边输一边画,每输入一个N,我就在屏幕上把这个图形画出来,但是经过实践,这个方法很慢,而且还有一个问题就是换号的问题很麻烦。观察到这个图形的长和宽其实是相等的,且都是3的(n-1)次方,那我们就可以用一个很大的二维数组来装这个图形(前提是题目给你的空间够大),也就是先把图形都画好,然后每次输入一个N,我们只需要输出数组中对应的已经画好的图形就好了。 这个图形其实可以分成9部分,每一个部分的规模temp=(3的(n-1)次方)/3,其中有5部分上面是次规模的图形,另外的4部分都是空格。那我们每次画之前就直接定位到这5各部分,设起始坐标为(x,y),那左上角的那一块的坐标为(x,y),右上角的坐标为(x+2*temp,y),左下角的那一块的坐标为(x,y+2*temp),右上角的坐标为(x+2*temp,y+2*temp),然后再分别对每个部分进行递归。画之前记得将数组的所有位置都初始化为空格哦,不然通不过。 现在图形可以画出来了,但是并不符合要求,因为按照题目要求,每一行的最后一个X后面是不能有空格的。那我们就可以在每次输出前,从后往前遍历每一行,确定每一行最后一个X的坐标k保存下来,然后输出的时候就只输出到k为止,然后换行输出下一行,这样每一行后面就不会有多余的空格。
二、注意细节 题目是有时间要求的,所以我们的代码里面不要有冗余的循环,或者是变量值计算,输出我采用的是c中的标准输入输出printf和scanf。
三、源代码
|
Fractal自相似图形
最新推荐文章于 2020-01-12 17:39:01 发布