MATHHEW

导航

hihoCoder#1039

刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正。

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:

 

1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。

  例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。

2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得

  到"ABB",再经过一轮消除得到"A"

 

游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之

后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉

的字符的总数。

 

请帮助小Hi计算要如何插入字符,才能获得最高得分。

 

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。

 

输出

对于每一行输入的字符串,输出小Hi最高能得到的分数。

 

提示

第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。

第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。

第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。

 

解决思路

对各个位置进行循环插入'A','B','C'计算得到分数如果分数比之前的分数高的话就取代前面的分数,如果有能够把所有字符都消除的方法

即得分达到输入的字符串个数加一时则停止。最后输出分数。

获取分数就是获取消除后最少能剩下的个数。获取消除后个数的方法:对字符串进行消除,每次将有两个或两个以上连续的相同字符

除掉,直到不存在连续两个相同的字符。

 

 

#include<stdio.h>

int GetScore(char str[]);
int GetNumAftElim(char str[]);

int main()
{
    int n,i,*Score;
    char str[101];
    scanf("%d",&n);
    Score=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
    {
        scanf("%s",&str);
        Score[i]=GetScore(str);
    }
    for(i=0;i<n;i++)
    {
    printf("%d\n",Score[i]);
    }
    free(Score);
    return 0;
}

int GetScore(char str[])
{
    int i,j,k,NumAftElim=101,NumA_l;
    char Istr[101];
    for(j='A';j<='C';j++)
    {
        for(i=0;str[i];i++)
        {
            for(k=0;k<i;k++)
            Istr[k]=str[k];
            Istr[i]=(char)j;
            for(k=i;str[k];k++)
            Istr[k+1]=str[k];
            Istr[k+1]=str[k];
            NumA_l=GetNumAftElim(Istr);
            if(NumAftElim>NumA_l)
            NumAftElim=NumA_l;
            if(NumAftElim==0)
            break;
        }
        if(NumAftElim==0)
        break;
    } 
    for(i=0;str[i];i++)
    {}
    return i+1-NumAftElim;
}

int GetNumAftElim(char str[])
{
    int i=1,j,k,count=0;
    char c='0';
    while(i)
    {
        i=0;k=0;c='0';
        for(j=0;str[j];j++)
        {
            if((int)c=='0')
            c=str[j];
            else if((int)c==(int)str[j])
                 {
                     count++;
                     i=1;
                 }
                 else if(count==0)
                      {
                        str[k++]=c;
                        c=str[j];
                      }
                      else
                      {
                        count=0;
                        c=str[j]; 
                      }
        }
        if(count==0)
        str[k++]=str[j-1];
        else
        count=0; 
        str[k]=0;
    }
    for(i=0;str[i];i++)
    {}
    return i;
}

 

 

 

 

posted on 2015-10-02 20:56  MATHHEW  阅读(537)  评论(0编辑  收藏  举报