fjnu 1964 龙珠游戏

来源:互联网 发布:徐宥箴 知乎 编辑:程序博客网 时间:2024/04/29 14:52

Description



如上图所示,在QQ龙珠游戏中,通过龙头射出珠子,将轨道中的珠子形成同色三个或以上(含射出的珠子)相连的状态而消去这些同色的珠子。如果没有消去珠子,则在相应的位置插入射出的珠子。注意珠子的消去动作是由同色珠子的碰撞诱发的,中间的珠子被消去后两边的珠子向中间靠拢也会产生碰撞。若没有碰撞动作,就算三个或以上的珠子同色相连也不会有消去产生。

示例:
珠子序列为:
AABBAA
对中间的BB射出B,形成:
AABBBAA
符合消去条件消去BBB:
AA***AA
此时两旁的AA向中间靠拢形成:
AAAA
符合消去条件,第二次消去发生,珠子全部被消去。
现由龙头射出一个给定颜色的珠子,如何消去最多的珠子?

Input

第一行为一个正整数n (0<n<100),表示下面有n个测试用例。每个测试用例由两行组成,其中第一行为一个由大写字母组成的长度小于255的字符串,表示珠子序列,另一行只含一个大写字符,表示要发射的珠子。(一个字母代表一个珠子,字母相同则珠子颜色相同)

Output

对应每个测试用例输出一行,含一个正整数,表示最多消去的珠子数目(计数时含射出的珠子)。

Sample Input

1CABBAACB

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<=1continue;
        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<=2break;
            
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;
}