Problem Description
读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出。
Input
题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束。
1<=length<=100。
1<=length<=100。
Output
对于每组输入,请输出一行,表示按照要求处理后的字符串。
具体可见样例。
具体可见样例。
Sample Input
ZZOOOJJJ ZZZZOOOOOJJJ ZOOOJJ E
Sample Output
ZOJZOJOJ ZOJZOJZOJZOO ZOJOJO
本来以为这道题很难要分很多种情况,第一次写的直接超时。
后来发现相当简单只要把条件设好就行(手动再见)。
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,t1,t2,t3;
char zm[1000];
while(scanf("%s",zm)&&zm[0]!='E')
{
t1=t2=t3=0;
n=strlen(zm);
for(i=0;i<n;i++)
{
if(zm[i]=='Z')
t1++;
if(zm[i]=='O')
t2++;
if(zm[i]=='J')
t3++;
}
while(t1||t2||t3)
{
if(t1!=0)
{
printf("Z");
t1--;
}
if(t2!=0)
{
printf("O");
t2--;
}
if(t3!=0)
{
printf("J");
t3--;
}
}
printf("\n");
}
return 0;
}
然后……把第一次写的贴出来展示一下我到底有多蠢。(血泪脸)
居然还写了130行(我的天哪.jpg)
#include<stdio.h>
#include<string.h>
char zm[10000],ch[10000];
int main()
{
int n,i,t1,t2,t3;
while(scanf("%s",zm)&&zm[0]!='E')
{
t1=t2=t3=0;
n=strlen(zm);
for(i=0;i<n;i++)
{
if(zm[i]=='Z')
t1++;
if(zm[i]=='O')
t2++;
if(zm[i]=='J')
t3++;
}
for(i=1;i<=n;)
{
ch[i]='Z';
ch[i+1]='O';
ch[i+2]='J';
t1--;
t2--;
t3--;
i+=3;
if(t1==0)
{
for(;i<=n;)
{
for(;i<=n;)
{
while(t2==0)
{
ch[i]='J';
i++;
t3--;
if(t3==0)
break;
}
while(t3==0)
{
ch[i]='O';
i++;
t2--;
if(t2==0)
break;
}
break;
}
ch[i]='O';
ch[i+1]='J';
t2--;
t3--;
i+=2;
}
break;
}
if(t2==0)
{
for(;i<=n;)
{
for(;i<=n;)
{
while(t1==0)
{
ch[i]='J';
i++;
t3--;
if(t3==0)
break;
}
while(t3==0)
{
ch[i]='Z';
i++;
t1--;
if(t1==0)
break;
}
break;
}
ch[i]='Z';
ch[i+1]='J';
t1--;
t3--;
i+=2;
}
break;
}
if(t3==0)
{
for(;i<=n;)
{
for(;i<=n;)
{
while(t2==0)
{
ch[i]='Z';
i++;
t1--;
if(t1==0)
break;
}
while(t1==0)
{
ch[i]='O';
i++;
t2--;
if(t2==0)
break;
}
break;
}
ch[i]='Z';
ch[i+1]='O';
t2--;
t1--;
i+=2;
}
break;
}
}
for(i=1;i<n;i++)
printf("%c",ch[i]);
printf("%c\n",ch[i]);
}
return 0;
}
能想得这么麻烦我真是个天才T皿T