POJ 3768(分形+递归)
2018-02-18 19:29
309 查看
题目链接:点击打开链接
题目大意:输入一个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;
}
题目大意:输入一个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;
}
相关文章推荐
- (简单递归3.4.1)POJ 2083 Fractal(分形图的打印)
- POJ 2083 Fractal 递归画分形
- poj 2083 Fractal 分形基本方法( 总结) 递归
- POJ 3768 Repeater 较复杂 分形 题目
- poj 3768 递归(绘制图形)
- 有趣的分形图形-递归和数学方法解决-POJ 2083
- poj 3768 Repeater 递归
- POJ 2255/递归:前序中序求后序
- POJ-----1664---放苹果---递归 思维
- POJ 1780 - Code 非递归..输出欧拉回路边路径..
- poj 1664 递归
- POJ 1011 递归 &amp; 回溯
- 【递归】分形
- poj 1941 递归输出图形(Sierpinski Fractal)
- POJ 1664 分苹果(递归)。
- POJ-1240(分治,递归降解)
- POJ 1519 求大数各位上数字之和 大数处理 递归
- 总结: 求逆序对 递归分治(与poj 22…
- 非递归线段树区间修改区间求和的两种实现(以POJ 3468为例)
- POJ 1731(递归方式|next_permutation())