成长轨迹49 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2819:W的密码】
题目http://poj.grids.cn/practice/2819
思路:
和j讨论的题目,等价于对串做特定次数的向右循环。我才不会告诉你我们一共wa和runtime error各3次。。。
一开始的思路是将“溢出”的放在另一个数组前面部分,移动完原数组前面部分之后,再将另一个数组的前面部分拿过来
【j一开始的wa代码】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h>
2 #include<string.h>
3 void trans(int* a,int k,int l)
4 {
5 int b[100]={0};
6 for(int i=0;i<k;i++)
7 b[i]=a[l-k+i];
8 for(int i=l-1-k;i>=0;i--)
9 {
10 a[i+k]=a[i];
11 }
12 for(int i=k-1;i>=0;i--)
13 {
14 a[i]=b[k-1-i];
15 }
16 }
17 int main()
18 {
19 int k1,k2,k3;
20 char code[110];
21 while(scanf("%d%d%d",&k1,&k2,&k3),!(k1==0&&k2==0&&k3==0))
22 {
23 scanf("%s",code);
24 int m[3][110];
25 int od[110];
26 int q=0,w=0,e=0;
27 int le=strlen(code);
28 for(int i=0;i<110;i++) { m[0][i]=m[1][i]=m[2][i]=od[i]=-1; }
29
30 for(int i=0;i<le;i++)
31 {
32 if(code[i]>='a'&&code[i]<='i') { m[0][q++]=i;od[i]=0;}
33 if(code[i]>='j'&&code[i]<='r') { m[1][w++]=i;od[i]=1;}
34 if(code[i]>='s'&&code[i]<='z'||code[i]=='_') { m[2][e++]=i;od[i]=2;}
35 }
36 trans(m[0],k1,q);
37 trans(m[1],k2,w);
38 trans(m[2],k3,e);
39 int a[3]={0};
40 for(int i=0;i<le;i++)
41 printf("%c",code[m[ od[i] ][ a[od[i]]++ ]] );
42 printf("\n");
43 }
44 }
我做了如下改动之后ac~
1、在tran中添加
if(!l)
return;
if(k>l)
k = k%l;
2、b[i]=a[l-1-i];改成b[i]=a[l-k+i];
3、a[i]=b[k-1-i];改成a[i]=b[i];
【ac代码】
1 #include<stdio.h>
2 #include<string.h>
3 void trans(int* a,int k,int l)
4 {
5 if(!l)
6 return;
7 if(k>l)
8 k = k%l;
9 int b[100]={0};
10 for(int i=0;i<k;i++)
11 b[i]=a[l-k+i];
12 for(int i=l-1-k;i>=0;i--)
13 {
14 a[i+k]=a[i];
15 }
16 for(int i=k-1;i>=0;i--)
17 {
18 a[i]=b[i];
19 }
20 }
21 int main()
22
23 {
24
25 int k1,k2,k3;
26 char code[110];
27 while(scanf("%d%d%d",&k1,&k2,&k3),!(k1==0&&k2==0&&k3==0))
28 {
29 scanf("%s",code);
30 int m[3][110];
31 int od[110];
32 int q=0,w=0,e=0;
33 int le=strlen(code);
34 for(int i=0;i<110;i++) { m[0][i]=m[1][i]=m[2][i]=od[i]=-1; }
35
36 for(int i=0;i<le;i++)
37 {
38 if(code[i]>='a'&&code[i]<='i') { m[0][q++]=i;od[i]=0;}
39 if(code[i]>='j'&&code[i]<='r') { m[1][w++]=i;od[i]=1;}
40 if(code[i]>='s'&&code[i]<='z'||code[i]=='_') { m[2][e++]=i;od[i]=2;}
41 }
42 trans(m[0],k1,q);
43 trans(m[1],k2,w);
44 trans(m[2],k3,e);
45 int a[3]={0};
46 for(int i=0;i<le;i++)
47 printf("%c",code[m[ od[i] ][ a[od[i]]++ ]] );
48 printf("\n");
49 }
50 }
//其实想向右移动,而且前面“溢出”的位从后面补上可以用求余的办法
//j对trans函数做改进后的ac代码:
#include<stdio.h>
#include<string.h>
int main()
{
int k1,k2,k3;
char code[210],buf[210];
while(scanf("%d%d%d",&k1,&k2,&k3),!(k1==0&&k2==0&&k3==0))
{
scanf("%s",code);
int m0[210],m1[210],m2[210];
int od[210];
int q=0,w=0,e=0;
int le=strlen(code);
for(int i=0;i<210;i++) { m0[i]=m1[i]=m2[i]=od[i]=-1; }
for(int i=0;i<le;i++)
{
if(code[i]>='a'&&code[i]<='i') { m0[q++]=i;od[i]=0;}
if(code[i]>='j'&&code[i]<='r') { m1[w++]=i;od[i]=1;}
if(code[i]>='s'&&code[i]<='z'||code[i]=='_') { m2[e++]=i;od[i]=2;}
}
for(int i=0;i<q;i++)
{
buf[m0[(i+k1)%q]]=code[m0[i]];
}
for(int i=0;i<w;i++)
{
buf[m1[(i+k2)%w]]=code[m1[i]];
}
for(int i=0;i<e;i++)
{
buf[m2[(i+k3)%e]]=code[m2[i]];
}
buf[strlen(code)]='\0';
printf("%s\n",buf);
}
}