首页 > 代码库 > 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函数的书写时关键,注意体会。