分形【分治递归】
2017-05-31 17:31
197 查看
问题描述:
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
一个分形块可以定义为如下内容:
度数为1的分形块表示为:
X
度数为2的分形块表示为:
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的分形块!
输入:
输入包括多个测试样例,每个测试样例是一个不超过7的正整数,以-1表示输入结束。
输出:
对于每一个测试样例,用大写字母‘X’表示分形盒子中的元素,按照度数要求输出分形块。每一个分形块输出结束后用破折号‘-’分隔。
输入样例:
1
2
3
4
-1
输出样例:
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
-
import java.util.Arrays;
import java.util.Scanner;
public class Main {
void cal(char[][] a,int n,int x,int y){
if(n == 1){
a[x][y]='X';
return ;
}
int m=(int) Math.pow(3, n-2);//为度为n-1形状的长度,也为同行间的空白长度
cal(a,n-1,x,y);//赋值左上角
cal(
4000
a,n-1,x,y+2*m);//赋值右上角
cal(a,n-1,x+m,y+m);//赋值中间
cal(a,n-1,x+2*m,y);//赋值左下角
cal(a,n-1,x+2*m,y+2*m);//赋值右下角
}
void print(char[][] a){//打印,注意格式问题,每行后面不能有多余的空格
for(int i=0;i<a.length;i++){
for(int j=a[i].length-1;;j--){
if(a[i][j] == 'X'){
break;
}
a[i][j]='!';
}
}
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(a[i][j] == '!'){
break;
}
System.out.print(a[i][j]);
}
System.out.println();
}
System.out.println("-");
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Main main=new Main();
int n=0;
while((n=in.nextInt()) != -1){
int size=(int) Math.pow(3, n-1);
char[][] a=new char[size][size];
for(int i=0;i<a.length;i++){//赋初值
Arrays.fill(a[i], ' ');
}
main.cal(a,n,0,0);//递归赋值
main.print(a);//打印
}
}
}
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
一个分形块可以定义为如下内容:
度数为1的分形块表示为:
X
度数为2的分形块表示为:
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的分形块!
输入:
输入包括多个测试样例,每个测试样例是一个不超过7的正整数,以-1表示输入结束。
输出:
对于每一个测试样例,用大写字母‘X’表示分形盒子中的元素,按照度数要求输出分形块。每一个分形块输出结束后用破折号‘-’分隔。
输入样例:
1
2
3
4
-1
输出样例:
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
-
import java.util.Arrays;
import java.util.Scanner;
public class Main {
void cal(char[][] a,int n,int x,int y){
if(n == 1){
a[x][y]='X';
return ;
}
int m=(int) Math.pow(3, n-2);//为度为n-1形状的长度,也为同行间的空白长度
cal(a,n-1,x,y);//赋值左上角
cal(
4000
a,n-1,x,y+2*m);//赋值右上角
cal(a,n-1,x+m,y+m);//赋值中间
cal(a,n-1,x+2*m,y);//赋值左下角
cal(a,n-1,x+2*m,y+2*m);//赋值右下角
}
void print(char[][] a){//打印,注意格式问题,每行后面不能有多余的空格
for(int i=0;i<a.length;i++){
for(int j=a[i].length-1;;j--){
if(a[i][j] == 'X'){
break;
}
a[i][j]='!';
}
}
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(a[i][j] == '!'){
break;
}
System.out.print(a[i][j]);
}
System.out.println();
}
System.out.println("-");
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Main main=new Main();
int n=0;
while((n=in.nextInt()) != -1){
int size=(int) Math.pow(3, n-1);
char[][] a=new char[size][size];
for(int i=0;i<a.length;i++){//赋初值
Arrays.fill(a[i], ' ');
}
main.cal(a,n,0,0);//递归赋值
main.print(a);//打印
}
}
}
相关文章推荐
- POJ 2245(分治递归)
- leetcode 53. Maximum Subarray(分治,递归)
- 求平面最近点对(分治与递归,注:最远点对用凸包求)
- 【算法设计与分析】递归与分治----2.4 排列问题
- 递归和分治策略之二分搜索法
- Java语言描述:递归与分治策略之全排列问题
- 递归与分治策略之二分搜索算法
- 递归与分治策略-2.8快速排序
- 递归与分治策略-2.9.1线性时间选择(随机划分基准)(第k小问题)
- UVA 177 PaperFolding 折纸痕 (分形,递归)
- 【从零学习经典算法系列】分治与递归1——递归表达式与解法初步
- 【从零学习经典算法系列】分治与递归2——主方法
- 递归、分治和动态规划的关系
- Python递归绘制分形树
- 递归与分治
- 递归和分治思想2 – 数据结构和算法32
- hdu 4643 (分治+递归)
- pku1635树的最小表示--分治递归
- 分治与递归分析
- 算法设计与分析笔记——递归与分治