传送门: www.lydsy.com/JudgeOnline/problem.php?id=1258
美妙的分形有递归的性质,所以我们当然要有递归的思想来解这道题,
我们把扩展画成一棵树,每个节点记录1.他的编号2.他形成的四个子树(即分出的四个子三角形)3.他靠的三角形编号(不难发现最多只有三个)
我们来看一个三角形,把他所接触的三条边分成三块
显然T1继承父节点的1,2“靠”着的,自己的“靠”3是T4
T2继承1,3,自己的2靠T4
T3继承2,3,自己的1靠T4
T4不继承,靠T1,T2,T3
有了递归的性质,这样我们就可以递推出来了,从根节点一点点往下不断更新,完了,
Code:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int a[51];
int len=0;
struct node{
node *c[5];
string name;
string s[4];
node(){
c[0]=c[1]=c[2]=c[3]=c[4]=NULL;
}
}*root;
int main(){
char ch;
getchar();
while((ch=getchar())!='\n')
a[++len]=ch-'0';
root=new node();
root->name='T';
root->s[1]='T';
root->s[2]='T';
root->s[3]='T';
for(int i=1;i<=len;i++){
if(a[i]==1){
root->c[1]=new node();
root->c[1]->name=root->name+'1';
root->c[1]->s[1]=root->s[1];
root->c[1]->s[2]=root->s[2];
root->c[1]->s[3]=root->name+'4';
root=root->c[1];
}else
if(a[i]==2){
root->c[2]=new node();
root->c[2]->name=root->name+'2';
root->c[2]->s[1]=root->s[1];
root->c[2]->s[2]=root->name+'4';
root->c[2]->s[3]=root->s[3];
root=root->c[2];
}else
if(a[i]==3){
root->c[3]=new node();
root->c[3]->name=root->name+'3';
root->c[3]->s[1]=root->name+'4';
root->c[3]->s[2]=root->s[2];
root->c[3]->s[3]=root->s[3];
root=root->c[3];
}else{
root->c[4]=new node();
root->c[4]->name=root->name+'4';
root->c[4]->s[1]=root->name+'1';
root->c[4]->s[2]=root->name+'2';
root->c[4]->s[3]=root->name+'3';
root=root->c[4];
}
}
string str[3];
str[0]=root->s[1];
str[1]=root->s[2];
str[2]=root->s[3];
sort(str,str+3);
for(int i=0;i<3;i++)
if(str[i]!="T")
cout<<str[i]<<endl;
return 0;
}