Fractal

Fractal

Time Limit: 2 Seconds      Memory Limit: 65536 KB      Score: 1

问题描述

你们懂分形么?分形很美。

给大家介绍一种分形图,Sierpinski 三角形,它的分形过程可以用这张图直观的展现:

画一个等边三角形,找到三个边的中点,相互连起来,就得到了四个三角形,重复对外部的三个进行这个动作,就得到了 13 个三角形,一直进行下去,就是 Sierpinski 三角形了。

然后你要解决的问题来了:

我们对三角形这样标号,以 T 开头,上面的是 1,左下角是 2,右下角是 3,中间是 4,然后再次被划分出来的三角形的标号方式也是一样。

可以看到每个标号的三角形都有其相邻的三角形,给定一个三角形的编号,你需要找到和这个三角形相邻的三角形的编号。相邻指的是有一条边有重叠。

输入格式

仅有一行,以 T 开头的字符串,后面有若干位 [1, 3] 的正整数,表示三角形的编号。

输出格式

输出所有相邻的三角形的编号,每个占一行,按字典序大小输出。

样例输入

T312

样例输出

T314
T34
T4

数据范围

输入字符串长度 ≤ 60


分形图问题,最好是递归,While循环也行。
#include<stdio.h>
#include<string.h>
char K[100];
char X[100],Y[100],Z[100];
int x,y,z;
char P[3][100];
int main()
{
	int a,b,c,d,len;
	scanf("%s",K);
	x=1;y=1;z=1;
	for(len=0;K[len]!='\0';len++);
	char A,B;
	A=K[len-1]-'0';
	strcpy(X,K);strcpy(Y,K);
	strcpy(Z,K);
	if(A==4)
	{
		X[len-1]=1+'0';
		Y[len-1]=2+'0';
		Z[len-1]=3+'0';
	}
	else if(A==1)
	{
		Z[len-1]=4+'0';
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==3)
			{
				X[b]=4+'0';X[b+1]='\0';
				break;
			}
			b--;
		}
		if(b==0)x=0;
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==2)
			{
				Y[b]=4+'0';Y[b+1]='\0';
				break;
			}
		}
		if(b==0)y=0;
	}
	else if(A==2)
	{
		Y[len-1]=4+'0';
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==3)
			{
				X[b]=4+'0';X[b+1]='\0';
				break;
			}
			b--;
		}
		if(b==0)x=0;
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==1)
			{
				Z[b]=4+'0';Z[b+1]='\0';
				break;
			}
		}
		if(b==0)z=0;
	}
	else if(A==3)
	{
		X[len-1]=4+'0';
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==1)
			{
				Z[b]=4+'0';Z[b+1]='\0';
				break;
			}
			b--;
		}
		if(b==0)z=0;
		b=len-2;
		while(b!=0)
		{
			B=K[b]-'0';
			if(B==2)
			{
				Y[b]=4+'0';Y[b+1]='\0';
				break;
			}
		}
		if(b==0)y=0;
	}
	int cnt=-1;
	if(x!=0)
	{
		cnt++;
		strcpy(P[cnt],X);
	}
	if(y!=0)
	{
		cnt++;
		strcpy(P[cnt],Y);
	}
	if(z!=0)
	{
		cnt++;
		strcpy(P[cnt],Z);
	}
	char T[100];
	for(a=0;a<=cnt;a++)
	for(b=a+1;b<=cnt;b++)
	{
		if(strcmp(P[a],P[b])>0)
		{
			strcpy(T,P[a]);
			strcpy(P[a],P[b]);
			strcpy(P[b],T);
		}
	}
	for(a=0;a<=cnt;a++)printf("%s\n",P[a]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值