Description
如上图所示,在QQ龙珠游戏中,通过龙头射出珠子,将轨道中的珠子形成同色三个或以上(含射出的珠子)相连的状态而消去这些同色的珠子。如果没有消去珠子,则在相应的位置插入射出的珠子。注意珠子的消去动作是由同色珠子的碰撞诱发的,中间的珠子被消去后两边的珠子向中间靠拢也会产生碰撞。若没有碰撞动作,就算三个或以上的珠子同色相连也不会有消去产生。
示例:
珠子序列为:
AABBAA
对中间的BB射出B,形成:
AABBBAA
符合消去条件消去BBB:
AA***AA
此时两旁的AA向中间靠拢形成:
AAAA
符合消去条件,第二次消去发生,珠子全部被消去。
现由龙头射出一个给定颜色的珠子,如何消去最多的珠子?
Input
第一行为一个正整数n (0<n<100),表示下面有n个测试用例。每个测试用例由两行组成,其中第一行为一个由大写字母组成的长度小于255的字符串,表示珠子序列,另一行只含一个大写字符,表示要发射的珠子。(一个字母代表一个珠子,字母相同则珠子颜色相同)
Output
对应每个测试用例输出一行,含一个正整数,表示最多消去的珠子数目(计数时含射出的珠子)。
Sample Input
1 CABBAAC B
Sample Output
6
Source
福建师范大学第五届程序设计竞赛
KEY:这题开始我就把题目理解错了,亏我龙珠还打得那么好……后来想通了,要碰撞才有消去啊……我居然给忘了……搞死了……
Source:
#include < iostream >
using namespace std;
char str[ 300 ];
char c;
int count( char s[])
... {
int len=strlen(s);
int k;
int i,j;
char t;
int tmp=0,max=0;
for(k=0;k<len;k++)
...{
i=j=k;
t=c;
while(s[i]==c&&i>=0) i--;
while(s[j]==c&&j<len) j++;
if(j-i-1<=1) continue;
tmp=j-i-1+1;
while(i>=0&&j<=len-1)
...{
if(s[i]!=s[j]) break;
t=s[i];
while(s[i]==t&&i>=0) i--;
while(s[j]==t&&j<len) j++;
int x=j-i-1-(tmp-1);
if(x<=2) break;
else tmp+=x;
}
if(tmp>max) max=tmp;
}
return max;
}
int main()
... {
// freopen("fjnu_1964.in","r",stdin);
int N;
char s[300],tmp[10];
scanf("%d ",&N);
for(int i=1;i<=N;i++)
...{
scanf("%s %c ",str,&c);
strcpy(s,str);
cout<<count(s)<<endl;
}
return 0;
}
#include < iostream >
using namespace std;
char str[ 300 ];
char c;
int count( char s[])
... {
int len=strlen(s);
int k;
int i,j;
char t;
int tmp=0,max=0;
for(k=0;k<len;k++)
...{
i=j=k;
t=c;
while(s[i]==c&&i>=0) i--;
while(s[j]==c&&j<len) j++;
if(j-i-1<=1) continue;
tmp=j-i-1+1;
while(i>=0&&j<=len-1)
...{
if(s[i]!=s[j]) break;
t=s[i];
while(s[i]==t&&i>=0) i--;
while(s[j]==t&&j<len) j++;
int x=j-i-1-(tmp-1);
if(x<=2) break;
else tmp+=x;
}
if(tmp>max) max=tmp;
}
return max;
}
int main()
... {
// freopen("fjnu_1964.in","r",stdin);
int N;
char s[300],tmp[10];
scanf("%d ",&N);
for(int i=1;i<=N;i++)
...{
scanf("%s %c ",str,&c);
strcpy(s,str);
cout<<count(s)<<endl;
}
return 0;
}