晴天的魔法乐园——谢尔宾斯基地毯(递归打印图形)「建议收藏」

晴天的魔法乐园——谢尔宾斯基地毯(递归打印图形)「建议收藏」题目链接:https://judger.net/problem/1061ProblemDescription谢尔宾斯基地毯是一种分形图案,它的定义如下:令F(n)表示嵌套n层的谢尔宾斯基地毯,那么(下面的“空”均表示空格,仅为示意,实际输出时应仍为空格)当n=1时,F(1)为:空当n=2时,F(2)为:空空空空X空空空空一般地,如果F(n-1)表示嵌…

大家好,又见面了,我是你们的朋友全栈君。

题目链接:https://judger.net/problem/1061

Problem Description

谢尔宾斯基地毯是一种分形图案,它的定义如下:
令F(n)表示嵌套n层的谢尔宾斯基地毯,那么(下面的“空”均表示空格,仅为示意,实际输出时应仍为空格)
当n=1时,F(1)为:

当n=2时,F(2)为:

空空空
空X空
空空空

一般地,如果F(n-1)表示嵌套n-1层的谢尔宾斯基地毯,则F(n)的递归定义如下:

F(n-1)F(n-1)F(n-1)F(n-1)X(n-1)F(n-1)F(n-1)F(n-1)F(n-1)

其中X(n)表示边长为n的正方形,其内部被字符X完全填充。
现在输入一个正整数n,请画出嵌套n层的谢尔宾斯基地毯F(n)。

Input

每个输入文件一组数据。
第一行一个正整数N(N<=7),表示谢尔宾斯基地毯的嵌套层数。

Output

输出嵌套n层的谢尔宾斯基地毯。为了让输出看起来更像地毯,请用加号+将结果完整包裹起来。

Sample Input 1

1

Sample Output 1

+++
+ +
+++

Sample Input 2

2

Sample Output 2

+++++
+   +
+ X +
+   +
+++++

Sample Input 3

3

Sample Output 3

+++++++++++
+         +
+ X  X  X +
+         +
+   XXX   +
+ X XXX X +
+   XXX   +
+         +
+ X  X  X +
+         +
+++++++++++

Sample Input 4

4

Sample Output 4

+++++++++++++++++++++++++++++
+                           +
+ X  X  X  X  X  X  X  X  X +
+                           +
+   XXX      XXX      XXX   +
+ X XXX X  X XXX X  X XXX X +
+   XXX      XXX      XXX   +
+                           +
+ X  X  X  X  X  X  X  X  X +
+                           +
+         XXXXXXXXX         +
+ X  X  X XXXXXXXXX X  X  X +
+         XXXXXXXXX         +
+   XXX   XXXXXXXXX   XXX   +
+ X XXX X XXXXXXXXX X XXX X +
+   XXX   XXXXXXXXX   XXX   +
+         XXXXXXXXX         +
+ X  X  X XXXXXXXXX X  X  X +
+         XXXXXXXXX         +
+                           +
+ X  X  X  X  X  X  X  X  X +
+                           +
+   XXX      XXX      XXX   +
+ X XXX X  X XXX X  X XXX X +
+   XXX      XXX      XXX   +
+                           +
+ X  X  X  X  X  X  X  X  X +
+                           +
+++++++++++++++++++++++++++++

1、分析

递归打印,打印方法同上一篇博客:晴天的魔法乐园——盒分形​,唯一的区别是每次递归的时候有两个打印,即四周的和中央。

2、代码

#include<stdio.h>
#include<math.h>
const int maxn = 800;
char matrix[maxn][maxn];
//坐标 
int X[9] = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
int Y[9] = {-1, -1, -1, 0, 0, 0, 1, 1, 1};

void fill(int n, int x, int y){
	if(n == 1){
		return;
	}else if(n == 2){
		matrix[x][y] = 'X';
		return;
	}
	//画四周图形 
	for(int i = 0; i < 9; i++){
		int newX = x + X[i] * pow(3, n - 2);
		int newY = y + Y[i] * pow(3, n - 2);
		fill(n - 1, newX, newY);
	}
	//画中央图形
	for(int i = 0; i < 9; i++){
		int newX = x + X[i] * pow(3, n - 3);
		int newY = y + Y[i] * pow(3, n - 3);
		fill(n - 1, newX, newY);
	} 
} 

int main(){
	int n;
	scanf("%d", &n);
	fill(n, 400, 400);
	int scale = pow(3, n - 1);
	for(int i = 400 - scale / 2 - 1; i <= 400 + scale/2 + 1; i++){
		for(int j = 400 - scale / 2 - 1; j <= 400 + scale / 2 + 1; j++){
			//打印四周的'+' 
			if(j == 400 - scale / 2 - 1 || j == 400 + scale / 2 + 1 || i == 400 - scale / 2 - 1 || i == 400 + scale / 2 + 1){
				printf("+");
			}else if(matrix[i][j] == 'X'){
				printf("X");
			}else{
				printf(" ");
			}
		}
		printf("\n");
	}
	return 0;
}

原文链接:https://www.qsp.net.cn/art/176.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158432.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2010年软件外包企业排名, 软件外包公司排名2010

    2010年软件外包企业排名, 软件外包公司排名20101. 博朗软件 Bleum(上海)2. 中软国际(北京)3. 东软集团 Neusoft(沈阳)4. 博彦科技 BeyondSoft(北京)5. 海辉软件 HiSoft(大连)6. 文思 VanceInfo(北京)7. 浙大网新 Insigma (杭州)8. 奥博杰天 Objectiva(北京)9. 浪潮 Inspur(济南)…

    2022年5月5日
    67
  • vue 正则表达式验证_vue表单自定义验证

    vue 正则表达式验证_vue表单自定义验证首先需要自己写正则表达式,正则学得不好就不乱指点了=>方法1如果你是单独建的js文件先引入正则表达式文件才进行下一步或者直接在组件内写正则2data({constregExpID=(rule,value,callback)=>{//regExpID自定义类名if(value===”){//value验证的值不要更改会自动匹配你所需要验证的值ca…

    2025年8月22日
    0
  • win10安装虚拟机win7全部教程_服务器与虚拟服务器

    win10安装虚拟机win7全部教程_服务器与虚拟服务器现在很多的电脑都是预装的win10系统了,尽管win10系统是现在主流的操作系统,但是不少网友还是对xp念念不忘。这种情况下我们可以不需要安装双系统,在WINDOWS10安装XP系统虚拟机即可。下面小编就教下大家win10系统自带的虚拟机安装xp系统教程。具体的步骤如下:1、打开开始菜单,点击”控制面板”,点击”程序”。2、点击右侧的”启用或关闭Windows功能”。3、在新窗口下找到并选择Hy…

    2022年8月16日
    5
  • 【java并发编程】底层原理——用户态和内核态的区别

    【java并发编程】底层原理——用户态和内核态的区别一、背景–线程状态切换的代价java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。synch…

    2022年9月18日
    4
  • Java中常见的类加载器及双亲委派机制的原理

    相信不少的同学在面试的时候会被问到一个词:双亲委派,懂得同学懂,不懂的同学可能会尴尬一笑,那么今天咱们就来聊聊这个问题的原理,首先我们需要了解一下java中常见的几种类加载器。一、Java中常见的类加载器1.BootstrapClassLoader纯C++实现的类加载器,没有对应的Java类,主要加载的是jre/lib/目录下的核心库2.ExtClassLoader类的全名是…

    2022年4月9日
    30
  • Visio2010产品密钥

    Visio2010产品密钥VisioPremium2010密钥+激活成功教程激活方法:在安装时可以使用以下密钥:GR24B-GC2XY-KRXRG-2TRJJ-4X7DCVWQ6G-37WBG-J7DJP-CY66Y-V278X2T8

    2022年7月2日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号