问题描述
你们懂分形么?分形很美。
给大家介绍一种分形图,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;
}