这是个很有意思的水题。
首先显然如果是个4的话,肯定是把最后三位变成1、2、3.
而如果不是4的话,那么它肯定是和4相连。首先它肯定和同级的4相连。我们可以从小往大,判断这个三角形是否是在当前三角形的某个边界上。而比如说下边界遇到了1,左边界遇到了3,右边界遇到了2的话就就会遇到4,然后这个边界就被吃掉了。
我们还可以发现一个很有意思的事情,就是其实我们最多输出3个数!
因为末尾是4的话很显然了,而如果末尾不是4的话,它一共只有三条边,以4结尾的三角形之间是不互相包含的,所以它最多只会和3个三角形相连。
而通过上述做法,我们还能发现一个事情,就是其实输出是在倒数第一次出现的1、2、3。
但是——一定要试特殊数据!卧槽我特判结尾是4的时候。。第一遍忘了在前面加T,第二遍忘了按字典序输出。。
代码:
#include<cstdio>
char a[55];
bool fx[5];
int n;
void out(){
putchar('T');
for(int i=0;i<n;++i)putchar(a[i]);
puts("4");
}
int main(){
//freopen("bzoj_1258.in","r",stdin);
int i,j;
a[0]=getchar();
while(a[0]!='T')a[0]=getchar();
a[0]=getchar();
while(a[n]>'0'&&a[n]<'5')a[++n]=getchar();
if(a[--n]=='4'){
for(i=1;i<=3;++i){
putchar('T');
for(j=0;j<n;++j)putchar(a[j]);
printf("%d\n",i);
}
return 0;
}
//printf("%c\n",a[n]);
switch(a[n]){
case '1':fx[1]=fx[3]=1;break;
case '2':fx[1]=fx[2]=1;break;
case '3':fx[2]=fx[3]=1;break;
}
//printf("%d%d%d\n",fx[1],fx[2],fx[3]);
out();
while(~--n)
switch(a[n]){
case '1':
if(fx[2]){
out();
fx[2]=0;
}
break;
case '2':
if(fx[3]){
out();
fx[3]=0;
}
break;
case '3':
if(fx[1]){
out();
fx[1]=0;
}
break;
}
}