[CQOI2007]三角形tri 解题报告

这是个很有意思的水题。

首先显然如果是个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;
		}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值