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

传送门: www.lydsy.com/JudgeOnline/problem.php?id=1258

美妙的分形有递归的性质,所以我们当然要有递归的思想来解这道题,

我们把扩展画成一棵树,每个节点记录1.他的编号2.他形成的四个子树(即分出的四个子三角形)3.他靠的三角形编号(不难发现最多只有三个)


我们来看一个三角形,把他所接触的三条边分成三块

【BZOJ】【P1258】【CQOI2007】【三角形tri】【题解】【乱搞】_第1张图片

显然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;
}



你可能感兴趣的:(bzoj,省选)