BZOJ1258 三角形tri
找规律神题……
发现如果以4结尾,把4改成1、2、3输出就行了。
如果不以4结尾:
把结尾改成4输出即可,因为一定与三角形的中心相邻。
规律1:如果把串的末尾删去,那么会回到上一层。
如果这个串里只有1种数字,那么它一定在某个角上,只和自己这层的4相邻。
如果这个串里有2种数字,那么他在某条边上,和某层的4相邻,和自己的中心相邻。
如果这个串里有3中数字,那么它在大三角形里面,和这层的4,某层的4,另一层的4都相邻。
于是
规律2:这个串内有几种不同的数字,就和几个三角形相邻,并且一定以4结尾。
这还不够,接着找……
规律3:从后往前扫,第一次出现的数字前的子串+4是个答案不要问我怎么搞出这个规律的
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=55;
char s[N];
int n;
bool appear[4];
int main()
{
scanf("%s",s);
n=strlen(s)-1;
if(s[n]=='4')
{
for(int i=0;i<n;++i)printf("%c",s[i]);puts("1");
for(int i=0;i<n;++i)printf("%c",s[i]);puts("2");
for(int i=0;i<n;++i)printf("%c",s[i]);puts("3");
return 0;
}
for(int i=n;i>=1;--i)
{
int tmp=s[i]-'0';
if(!appear[tmp])
{
for(int j=0;j<i;++j)printf("%c",s[j]);puts("4");
appear[tmp]=true;
}
}
return 0;
}
路漫漫其修远兮,吾将上下而求索