设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。从环上的某两粒珠子问剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠

admin2012-03-13  43

问题 设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。从环上的某两粒珠子问剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠子中取走所有连续的同色珠子,两者之和为该剪开处可取走珠子的粒数。在不同位置剪开,能取走的珠子也不尽相同。
   本程序所求的是在环上哪个位置剪开,按上述规则可取走的珠子粒数最多。程序中用数组存储字符串。例如,10粒珠子颜色对应字符串为aaabbbadcc,在0号珠子前剪开,序列为aaabbbadcc,从左端取走3粒a色珠子,从右端取走2粒c色珠子,共取走5粒珠子。若在3号珠子前剪开,即bbbadccaaa,共取走6粒珠子。
   [C函数]
   int count(char *s,int start,int end)
   {  int i,c=0,color:s[start],step=(start>end)?-1:1;
      for(i=Start;s==color;i+=step){
         if(step>0  && i>end ||  (1)   )  break;
           (2)  ;
     }
     return c;
   }
   void main()
   {  char t,s[120];
      int i,k,c,len,maxc,cut=0;
      printf("请输入环上代表不同颜色珠子字符串:");
      scanf("%s”,s);
      len=strlen(s);
      for(i=maxc=0; i<len;i++)(    /*尝试不同的剪开方式*/
        c=count(s,0,len-1);
        if(c<len) c+=count(  (3)   );
        if(c>maxc) { cut=i;maxc=c;)
        /*数组s的元素循环向左移动一个位置*/
        t=s[0];
        for(j=1;j<len;j++)    (4)  ;
         (5)  ;
     }
     printf("在第%d号珠子前面剪开,可以取走%d个珠子.\n",cut,maxc);
   }

选项

答案(1)step<0 && i<end (2) ++c (3) s,len-1,c (4) s[j-1]=s[j] (5) s[len-1]=t

解析 依据取珠子个数最多的规则,count函数每次从左或从右取出相同颜色的珠子,因此从右到左的条件为step<0 && i<end,即(1)应填“step<0 && i<end”。当是同色珠子时,计数值加1,所以(2)填“++c”。从右到左计算时,函数count调用的实参次序为s,len-1,c。即(3)应填“s,len-1,c”。在尝试不同的剪开方式时,数组s的元素要循环向左移动一个位置,则(4)填“s[j-1]=s[j]”,(5)填“s[len-1]=t”。
转载请注明原文地址:https://jikaoti.com/ti/15W7FFFM
0

最新回复(0)