首页 > 代码库 > poj1107
poj1107
1 #include<stdio.h>
2 #include<string.h>
3 char s[85],r[85];
4 int f[85],a[3],num[3],len;
5 int transfer(int c,int k)
6 {
7 int i,t=0;
8 i=c;
9 while(t!=k)
10 {
11 i++;
12 if(i>len-1)
13 i=0;
14 if(f[i]==f[c])
15 t++;
16 }
17 r[i]=s[c];
18 return 0;
19 }
20 //转换字符采用的方式是把所有需要转换的数据按规定右移固定单位,如果所需要右移的单位超出本身的长度则重新从头开始查找,直到可以完成转换。
21 int main()
22 {
23 while(scanf("%d%d%d",&a[0],&a[1],&a[2])==3)
24 {
25 if(a[0]==0&&a[1]==0&&a[2]==0)
26 break;
27 getchar();
28 memset(f,0,sizeof(f));
29 gets(s);
30 int i;
31 len=strlen(s);
32 num[0]=num[1]=num[2]=0;
33 for(i=0;i<len;i++)
34 {
35 if(s[i]>=‘a‘&&s[i]<=‘i‘)
36 {
37 f[i]=1;
38 num[0]++;
39 }
40 else if(s[i]>=‘j‘&&s[i]<=‘r‘)
41 {
42 f[i]=2;
43 num[1]++;
44 }
45 else
46 {
47 f[i]=3;
48 num[2]++;
49 }
50 }
51 ///注意num[i]为0的情况
52 for(i=0;i<len;i++)
53 {
54 if(f[i]==1)
55 {
56 if(num[0])
57 transfer(i,a[0]%num[0]);
58 }
59 else if(f[i]==2)
60 {
61 if(num[1])
62 transfer(i,a[1]%num[1]);
63 }
64
65 else
66 {
67 if(num[2])
68 transfer(i,a[2]%num[2]);
69 }
70 }
71 r[len]=‘/0‘;
72 puts(r);
73 }
74 }
解题心得:
1.看清题意是关键;
2.题目中有很多细节需要注意包括num[i]是否为0,以及转换的长度是否超出三个区间所含字符本身的长度等;
3.Transfer函数的书写时关键,注意体会。