1629: yzm10铺地毯
时间限制: 2 Sec 内存限制: 64 MB
提交: 31 解决: 12
[提交] [状态] [讨论版] [命题人:201540704024]
题目描述
继yzm10铺瓷砖后,我们又收到了一项重要的任务,Consumer要求yzm10在光滑的地面上再铺设一层地毯,并且邀请您进行设计。挑剔的Consumer选择了如(图片)所示图案。
谢尔宾斯基地毯:采用的是正方形进行分形构造,谢尔宾斯基地毯和它本身的一部分完全相似,因此具有自相似性。其三维结构便是著名的门格尔海绵。
yzm10给出了地毯的构造层数(n<6),现在请您进行设计。
输入
一个正整数n
输出
打印图案
样例输入
输入样例1: 1 输入样例2: 2 输入样例3: 3
样例输出
输出样例1: ###### ## ## ###### 输出样例2: ################## ## #### #### ## ################## ###### ###### ## ## ## ## ###### ###### ################## ## #### #### ## ################## 输出样例3: ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ###### ############ ############ ###### ## ## ## #### ## ## #### ## ## ## ###### ############ ############ ###### ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ################## ################## ## #### #### ## ## #### #### ## ################## ################## ###### ###### ###### ###### ## ## ## ## ## ## ## ## ###### ###### ###### ###### ################## ################## ## #### #### ## ## #### #### ## ################## ################## ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ###### ############ ############ ###### ## ## ## #### ## ## #### ## ## ## ###### ############ ############ ###### ###################################################### ## #### #### #### #### #### #### #### #### ## ######################################################
提示
为保证打印图案尽可能接近正方形,将"##"视作一个字符。行首行尾没有多余空格。
注意:相似的图形,可以找到规律,用递归打印~~
题意:不解释~~
题解:简单递归,不知道为啥递归一直学的不好,气死了,这个题就是找到规律来做,规律就是从中间向8个方向递归下去,因为是相似的形状,最后注意递归出口就好了,上代码:
import java.util.*;
import java.math.*;
public class Main {
static Scanner cin = new Scanner(System.in);
static int [][] a = new int [250][250];
static int [] p = new int [7];
static void init() {
p[0]=1;
for (int i = 1; i < 6;i++) {
p[i]=p[i-1]*3;
}
}
static void dfs(int x,int y,int z) {
if(z==0) return;//递归出口
for (int i = x-z/2; i <= x+z/2;i++) {
for (int j = y-z/2;j <= y+z/2;j++) {
a[i][j]=1;//标记空白,想一下就知道为什么,不好解释~~~
}
}
dfs(x-z,y,z/3);dfs(x+z,y,z/3);//8个方向
dfs(x,y-z,z/3);dfs(x,y+z,z/3);
dfs(x-z,y-z,z/3);dfs(x+z,y+z,z/3);
dfs(x-z,y+z,z/3);dfs(x+z,y-z,z/3);
}
public static void main(String[] args){
init();
int n=cin.nextInt();
dfs(p[n]/2+1,p[n]/2+1,p[n-1]);
for (int i = 1; i <= p[n];i++) {
for (int j = 1; j <= p[n];j++) {
if(a[i][j]==1) System.out.print(" ");
else System.out.print("##");
}
System.out.println();
}
}
}