poj1107
解题心得:
1.看清题意是关键;
2.题目中有很多细节需要注意包括num[i]是否为0,以及转换的长度是否超出三个区间所含字符本身的长度等;
3.Transfer函数的书写时关键,注意体会。
1 1 #include<stdio.h> 2 3 2 #include<string.h> 4 5 3 char s[85],r[85]; 6 7 4 int f[85],a[3],num[3],len; 8 9 5 int transfer(int c,int k) 10 11 6 { 12 13 7 int i,t=0; 14 15 8 i=c; 16 17 9 while(t!=k) 18 19 10 { 20 21 11 i++; 22 23 12 if(i>len-1) 24 25 13 i=0; 26 27 14 if(f[i]==f[c]) 28 29 15 t++; 30 31 16 } 32 33 17 r[i]=s[c]; 34 35 18 return 0; 36 37 19 } 38 39 20 //转换字符采用的方式是把所有需要转换的数据按规定右移固定单位,如果所需要右移的单位超出本身的长度则重新从头开始查找,直到可以完成转换。 40 41 21 int main() 42 43 22 { 44 45 23 while(scanf("%d%d%d",&a[0],&a[1],&a[2])==3) 46 47 24 { 48 49 25 if(a[0]==0&&a[1]==0&&a[2]==0) 50 51 26 break; 52 53 27 getchar(); 54 55 28 memset(f,0,sizeof(f)); 56 57 29 gets(s); 58 59 30 int i; 60 61 31 len=strlen(s); 62 63 32 num[0]=num[1]=num[2]=0; 64 65 33 for(i=0;i<len;i++) 66 67 34 { 68 69 35 if(s[i]>='a'&&s[i]<='i') 70 71 36 { 72 73 37 f[i]=1; 74 75 38 num[0]++; 76 77 39 } 78 79 40 else if(s[i]>='j'&&s[i]<='r') 80 81 41 { 82 83 42 f[i]=2; 84 85 43 num[1]++; 86 87 44 } 88 89 45 else 90 91 46 { 92 93 47 f[i]=3; 94 95 48 num[2]++; 96 97 49 } 98 99 50 } 100 101 51 ///注意num[i]为0的情况 102 103 52 for(i=0;i<len;i++) 104 105 53 { 106 107 54 if(f[i]==1) 108 109 55 { 110 111 56 if(num[0]) 112 113 57 transfer(i,a[0]%num[0]); 114 115 58 } 116 117 59 else if(f[i]==2) 118 119 60 { 120 121 61 if(num[1]) 122 123 62 transfer(i,a[1]%num[1]); 124 125 63 } 126 127 64 128 129 65 else 130 131 66 { 132 133 67 if(num[2]) 134 135 68 transfer(i,a[2]%num[2]); 136 137 69 } 138 139 70 } 140 141 71 r[len]='/0'; 142 143 72 puts(r); 144 145 73 } 146 147 74 }