zoukankan      html  css  js  c++  java
  • 成长轨迹49 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2819:W的密码】

    题目http://poj.grids.cn/practice/2819


    思路:
       和j讨论的题目,等价于对串做特定次数的向右循环。我才不会告诉你我们一共wa和runtime error各3次。。。
       一开始的思路是将“溢出”的放在另一个数组前面部分,移动完原数组前面部分之后,再将另一个数组的前面部分拿过来

    【j一开始的wa代码】

    View Code
     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);

    }
    }



     

  • 相关阅读:
    Go语言入门
    简述cookies 和 session
    Linux inode 理解
    BZOJ 1012 最大数maxnumber
    BZOJ 1087 互不侵犯king
    CSS从大图中抠取小图完整教程(background-position应用)
    javascript中i++与++i
    脱离文档流分析
    在Windows上以zip压缩包方式安装mysql
    centos7 python2.7下安装paramiko模块
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2352420.html
Copyright © 2011-2022 走看看