17 - 01 - 07 POJ 2083 (递归画分形图)

本文介绍了一个使用递归算法绘制盒分形的C语言程序。盒分形是一种自相似的几何图形,通过递归调用自身来不断细化图案。文中给出了完整的代码实现,并解释了关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

啥?你不知道分形图是啥?看下面




图片选自(鸣谢):

http://www.matrix67.com/blog/archives/6231



/*
盒分形定义如下:
1度的盒分形为:
X
-
2度的盒分形为:
X X
 X
X X
-                                3度:
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
-                                4度
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
-
如果B(n-1)表示n-1度的盒分形,则n度的盒分形递归定义如下:

B(n-1) B(n-1)
   B(n-1)
B(n-1) B(n-1)

请画出n度的盒分形的图形
*/      
/*   输出格式如上图,输入数字(度数)*/

代码:  */


#include<stdio.h>
#include<math.h>
#include<stdio.h>

char map[777][777];

void DFS(int n,int x,int y) {
	int length;
	if(n == 1) {
		map[x][y] = 'X';
		return;
	}   //length是正方形的边长 
	length = pow(3.0,n-2);
	DFS(n-1,x,y);
	DFS(n-1,x,y+2*length);
	DFS(n-1,x+length,y+length);
	DFS(n-1,x+2*length,y);
	DFS(n-1,x+2*length,y+2*length);
}

int main() {
	int size,n,i,j;
	while(scanf("%d",&n) && n !=-1) {
		size = pow(3.0,n-1);
		for(i = 0; i<size; i++)
			for(j = 0; j<size; j++)
				map[i][j] = ' ';
		DFS(n,0,0);
		for(i = 0; i<size; i++) {
			for(j = 0; j<size; j++)
				printf("%c",map[i][j]);
			printf("\n");
		}
		printf("-\n");
	}
	return 0;
}

/*递归创建一个分形图,精髓都在递归里面,这个题的突破规律口是
这个图形的边长是有规律的 : length = pow(3.0 , n-1 )*/
/*曾出现编译错误,原因是pow(x,y)求 x 的 y 次方时候,x 必须是一个浮点数,所以是3.0.*/ 
//耗时 172ms,下面有一方法可以使时间降到 0 ms 哈哈 
/*打印生成的分形图时候:采用下面的输出方法:每次输出一行:T() = 0 ms 哈哈*/
for(i=0;i<size;i++)    
	map[i][size]='\0';    //设置每行字符串的结束符    
for(i=0;i<size;i++)    
	puts(map[i]);    //每次输出一行    
printf("-\n");

/*鸣谢http://blog.youkuaiyun.com/hackbuteer1/article/details/7321602提供思路,*/





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值