POJ 3768(分形+递归)

本文详细解析了一个通过递归方式复制图案的算法过程。该算法接收一个初始图案和复制次数作为输入,输出最终的图案。文章通过示例解释了复制顺序及实现方法,并提供了完整的C++代码实现。

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

题目链接:点击打开链接


题目大意:输入一个n表示原始图案的行和列,要求按照原图案的样子进行复制m次,求最后的图像


题目思路:太菜了..看了三个半小时才会...........................主要是不知道这个打印的过程以及如何实现的....我把中途的变量啥的都打出来然后才知道的...........这里详细地讲述一下..................


这分别是第一次复制和第二次复制的图形.......先把左上角这个大的复制完,然后是右上角的,为啥是这样复制的呢....首先先想一下,原图案被放入复制队列的顺序。是从左上角第一个一行行遍历来的,所以被拉近复制大军的顺序是先第一行最左开始,一行行来,复制也是按照这个顺序。


说完了复制顺序,接下来来谈咋实现...其实我们很容易发现,只要找到了其中一个人复制的位置,就能完成了,所以我们的本质,是找到第一个点在他对应的复制的位置的坐标,只要找到了剩下的按照第一个来就好了....


核心代码:dfs(m-1,x+i*size,y+j*size),i和j是每个点对应的坐标,*size就能到达那个对应的地方,这个需要自己多感悟感悟(我感觉其实还是我太菜不能表达..不过认真想想你能搞懂的..)


以下是代码:

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
char str[6][6],map[3005][3005];
int n,m;
void dfs(int m,int x,int y){
	if(m==1){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				map[x+i][y+j]=str[i][j];
			}
		}
		return;
	}
	int size=(int)pow(n*1.0,m-1);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(str[i][j]!=' '){
				dfs(m-1,x+i*size,y+j*size);
			}
		}
	}
}
int main(){
	while(~scanf("%d",&n)&&n){
		int size;
		getchar();
		for(int i=0;i<n;i++){
			gets(str[i]);
		}
		scanf("%d",&m);
		size=(int)pow(n*1.0,m);
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				map[i][j]=' ';
			}
			map[i][size]='\0';
		}
		dfs(m,0,0);
		for(int i=0;i<size;i++){
			printf("%s\n",map[i]);
		}
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值