/*
设一个环上有编号为 0~n-1 的 n 粒不同颜色的珠子
( 每粒珠子颜色用字母表示,n 粒珠子的颜色由输入的字符串表示)。
将环中某两粒珠子间剪开,环上珠子形成一个序列,然后按以下规则从序列
中取走珠子:首先从序列左端取走所有连续同色珠子;然后从序列右端在剩
下珠子中取走所有连续同色珠子,两者之和为该剪开处可取走珠子的粒数
。在不同位置剪开,能取走的珠子数不尽相同。
本程序所求的是在环上哪个位置剪开,按上述规则可取
走的珠子粒数最多。程序中用数组存储字符串。例如,10 粒珠
子颜色对应字符串为"aaabbbadcc",从 0 号珠子前剪开,
序列为 aaabbbadcc,从左端取走 3 粒 a 色珠子,从右端取走 2 粒 c 色珠子,
共取走 5 粒珠子。若在 3 号珠子前剪开,即 bbbadccaaa 共可取走 6 粒珠子。
*/
#include<iostream>
#include<cstring>
using namespace std;
int count(char *s,int start,int end)
{
int i,c=0;
int step=(start>end)?-1:1;
char color=s[start];
for(i=start;s[i]==color;i+=step)
{
if((step>0&&i>end)||(step<0&&i<end)) break;
c++;
}
return c;
}
int main()
{
char t,s[120];
int i,j,c,len,maxc,cut=0;
cout<<"请输入环上代表不同颜色珠子字符串:";
cin>>s;
len=strlen(s);
maxc=0;
for(i=0;i<len;i++)
{
c=count(s,0,len-1);
if(c<len) c+=count(s,len-1,0);
if(c>maxc)
{
cut=i;
maxc=c;
}
t=s[0];
for(j=1;j<len;j++)
s[j-1]=s[j];
s[j]=t;
}
cout<<cut<<endl<<maxc<<endl;
return 0;
}
希望不要改变我的思想,帮我该下这个小程序。在下不胜感激!!