【BZOJ】【P1258】【CQOI2007】【三角形tri】【题解】【乱搞】

来源:互联网 发布:金蝶进销存软件多少钱 编辑:程序博客网 时间:2024/06/06 13:58

传送门: 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];}elseif(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];}elseif(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;}



0 0
原创粉丝点击