题目为简单的模拟。读题比较麻烦其中旋转(rotated)这个表述我认为并不好。这样很难明白当k值大于部分串长度时的处理方式。
#include <iostream>
#include <stdio.h>
using namespace std;
char s[100];
char ss[100];
int s1[100],s2[100],s3[100];
void fu(int str[],int f,int k)
{
int p=0;
for(int i=f-k%f;i<f;i++) //这里这个k%f是题目的一个坑
{
ss[str[p]]=s[str[i]];
p++;
}
for(int i=0;i<f-k%f;i++)
{
ss[str[p]]=s[str[i]];
p++;
}
}
int main()
{
int k1,k2,k3;
int f1,f2,f3; //保存三个数组中的位置
int l;//字符串长度
scanf("%d%d%d",&k1,&k2,&k3);
while(k1!=0&&k2!=0&&k3!=0)
{
f1=f2=f3=l=0;
scanf("%s",s);
for(int i=0;s[i]!=0;i++)
{
if('a'<=s[i]&&s[i]<='i')
{
s1[f1]=i;
f1++;
}
else if('j'<=s[i]&&s[i]<='r')
{
s2[f2]=i;
f2++;
}
else
{
s3[f3]=i;
f3++;
}
l++;
}
//此时f1,f2,f3 中有s1,s2,s3的长度信息
//加入的测试cout<<f1<<" "<<f2<<" "<<f3<<" "<<l<<endl;
if(f1)
fu(s1,f1,k1);
if(f2)
fu(s2,f2,k2);
if(f3)
fu(s3,f3,k3);
ss[l]=0;
printf("%s\n",ss);
scanf("%d%d%d",&k1,&k2,&k3);
}
return 0;
}