NKOJ P7358 分形

问题描述

分形,具有以非整数维形式充填空间的形态特征。

通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

现在,定义“盒子分形”如下:

一级盒子分形:

   X

二级盒子分形:

   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的正整数n,代表要输出的盒子分形的等级。

输入的最后一行为-1,代表输入结束。

输出格式

对于每个测试用例,使用  符号"-"输出对应等级的盒子分形。

请注意X是一个大写字母。

每个测试用例后输出一个独立一行的短划线。

这道题我记得之前在acwing还是在哪做过,就是去找他坐标之间的变换关系并用递归处理,处理的时候加上四个坐标的偏移量记录到数组中最后在主函数里面先把数组处理到最大的状态再输出时找相应规模的部分并输出

//此处用m[i][j]记录是否为‘X’

这样就可以写出关键代码(来自chx):

void pr(int n,int x,int y){
	if(n==1)	m[x][y]='X';
	else{
		int k=pow(3,n-2);
//下面分别指左上,左下,右上,右下,中间的偏移量
		pr(n-1,x,y);
		pr(n-1,x+2*k,y);
		pr(n-1,x,y+2*k);
		pr(n-1,x+k,y+k);
		pr(n-1,x+2*k,y+2*k);
	}
}

 x和y初始化为一

接下来就是写main函数

main函数有几个注意事项:

1.要加初始化memset

2.有多组测试数据,所以要加

while(cin>>n)或者for(;;)

 3.内部的循环均<=pow(3,n-1);

然后,就是代码(这个代码有三处错误,仔细看了上面题解的一定会看出来)

#include<bits/stdc++.h>
using namespace std;
long long a,b,n;
char m[1000][1000];
void pr(int n,int x,int y){
	if(n==1)	m[x][y]='X';
	else{
		int k=pow(3,n-2);
		pr(n-1,x,y);
		pr(n-1,x+2*k,y);
		pr(n-1,x,y+2*k);
		pr(n-1,x+k,y+k);
		pr(n-1,x+2*k,y+2*k);
	}
}
int main() {
	for(;;){
		cin>>n;
		long long ans=pow(2,n-1);
		if(n==-1)	break;
		pr(n,n,n);
		for(int i=1;i<=ans;i++){
			for(int j=1;j<=ans;j++){
				if(m[i][j]=='X')	cout<<m[i][j];
				else cout<<" ";
			}
			cout<<endl;
		}
		cout<<"-"<<endl;
	}
	return 0;
}

接下来是一些休闲内容,不想看到就可以走了

最后,我想知道,有没有神人能把这道题打表做出来,如果有,我直接(倒立洗头

前面四个样例我已经为你准备好了,你想试试吗,少年

n=1

X

 n=2

X X
 X
X X

 n=3

X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X

n=4

X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X

n=5

cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<" X     X           X     X                             X     X           X     X\n";
			cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<"   X X               X X                                 X X               X X\n";
			cout<<"    X                 X                                   X                 X\n";
			cout<<"   X X               X X                                 X X               X X\n";
			cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<" X     X           X     X                             X     X           X     X\n";
			cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<"         X X   X X                                             X X   X X \n";
			cout<<"          X     X                                               X     X\n";
			cout<<"         X X   X X                                             X X   X X\n";
			cout<<"            X X                                                   X X\n";
			cout<<"             X                                                     X\n";
			cout<<"            X X                                                   X X\n";
			cout<<"         X X   X X                                             X X   X X\n";
			cout<<"          X     X                                               X     X\n";
			cout<<"         X X   X X                                             X X   X X\n";
			cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<" X     X           X     X                             X     X           X     X\n";
			cout<<"X X   X X         X X   X X                           X X   X X         X X   X X\n";
			cout<<"   X X               X X                                 X X               X X\n";
			cout<<"    X                 X                                   X                 X\n";
			cout<<"   X X               X X                                 X X               X X\n";
			cout<<"X X   X X         X X   X X  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值