码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5237

时间:2015-09-06 17:39:23      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.hdu.edu.cn/showproblem.php?pid=5237

 
  这是一道单纯的模拟题,首先是对于题意的理解:给一个字符串,求进行k次变换之后该字符串的结果。
  每一次的变换方法为:1.将字符串分为没三个字符一组;2.对于一组的每个字符,将其ASCII码值改写为二进制,不够八位的在前面补0(如果每次都对数组清空后从后面填数字,就不必考虑前面加0的情况);3.对于得到的24位数组,将其每6个字符分为一组,每组的6位变换为十进制,每个十进制数字对应一个字符(对应关系用字符串就可以解决);4.按顺序将变换之后得到的字符输出;5.对于字符串长度不能被三整除的,变为二进制后,对于不满八位的地方,在后面补0,剩下的不够四个字符就用等号补满;
  理解了题意之后,就是如何清晰地解决问题了。对于这种多步骤的问题,如果用函数的方法就可以让代码更加清晰,修改起来也更方便。
  
  技术分享
  
  下面附上AC的代码:
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<iostream>
  5 #include<cmath>
  6 #include<map>
  7 #include<queue>
  8 using namespace std;
  9 int a[32];
 10 char s[99990],ch[99990];
 11 int b[32];
 12 char q[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 13 void fun1(int j,char c){
 14     int i,k,m,n;
 15     m=(int)c;
 16     for(i=j*8+7;i>=j*8;i--){
 17         a[i]=m%2;
 18         m/=2;
 19     }
 20 }//把字母换成二进制
 21 int fun2(int j){
 22     int i,k,m,n;
 23     for(i=j*6;i<=j*6+5;i++){
 24         if(a[i]!=0)
 25             break;
 26     }
 27     m=0;
 28     for(k=i;k<=j*6+5;k++){
 29         m=m*2+a[k];
 30     }
 31     return m;
 32 }//把24位二进制数字改编为十进制编号
 33 void fun(){
 34     int i,j,k,m,n,l,r,z,y;
 35     int st=strlen(s);
 36     bool flag;
 37     char c;
 38     l=0;
 39     for(i=0;i<st/3;i++){
 40         memset(a,0,sizeof(a));
 41         for(j=0;j<3;j++){
 42             c=s[i*3+j];
 43             fun1(j,c);
 44         }
 45         for(j=0;j<4;j++){
 46             k=fun2(j);
 47             ch[l]=q[k];
 48             l++;
 49         }
 50     }
 51     memset(a,0,sizeof(a));
 52     if(st%3==1){
 53         for(i=0;i<1;i++){
 54             c=s[st/3*3+i];
 55             fun1(i,c);
 56         }
 57         for(i=0;i<2;i++){
 58             k=fun2(i);
 59             ch[l]=q[k];
 60             l++;
 61         }
 62         ch[l]==;
 63         l++;
 64         ch[l]==;
 65         l++;
 66     }
 67     else if(st%3==2){
 68         for(i=0;i<2;i++){
 69             c=s[st/3*3+i];
 70             fun1(i,c);
 71         }
 72         for(i=0;i<3;i++){
 73             k=fun2(i);
 74             ch[l]=q[k];
 75             l++;
 76         }
 77         ch[l]==;
 78         l++;
 79     }
 80     ch[l]=\0;
 81     strcpy(s,ch);
 82 }//字符串变换函数
 83 int main()
 84 {
 85     int k,i,j,m,n;
 86     int x,y,z;
 87     int t,cas;
 88     cas=0;
 89     scanf("%d",&t);
 90     while(t--){
 91         scanf("%d%*c",&k);
 92         gets(s);
 93         while(k--){
 94             fun();
 95         }
 96         cas++;
 97         printf("Case #%d: ",cas);
 98         printf("%s\n",s);
 99     }
100     return 0;
101 }

 


技术分享

hdu5237

标签:

原文地址:http://www.cnblogs.com/acm31415/p/4786357.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!