zoukankan      html  css  js  c++  java
  • 7.12 枚举-Jam的计数法

    为大家讲述一道枚举类的题目。

    题目描述

    Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{bcdefghij}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U<V,且不存在Jam数字P,使U<P<V)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。


    输入

    每组输入数据有2行,第1行为3个正整数,用一个空格隔开:
    s t w
    (其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T≤26,2≤w≤t-s )
    第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。
    所给的数据都是正确的,不必验证。
     

    输出

    每组输出最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。


    样例输入 Copy

    2 10 5
    bdfij

    样例输出 Copy

    bdghi
    bdghj
    bdgij
    bdhij
    befgh


    题解代码:
    #include<iostream>
    #include<string>
    using namespace std;
    int s,t,w;
    char ch[26],l,r;
    int main(){
     scanf("%d%d%d",&s,&t,&w);
     l=s+'a'-1;
     r=t+'a'-1;
     cin>>ch;
     for(int i=1;i<=5;i++){
      int k=w-1; //从最后一位向前枚举
    //重
      while(k>=0&&ch[k]==r+k+1-w)k--;
      if(k==-1) break;
      ch[k]++;
      for(int j=k+1;j<w;j++){
       ch[j]=ch[j-1]+1;
      }
    //点!!!
      cout<<ch<<endl;
     }
     return 0;
    }

    题解思路:
    这道题的中心思想是从数组的最后一位元素向前枚举,看该元素能否继续向下枚举,即在数组中从后向前的元素是否与s到t从后向前数元素一样,
    若不一样,跳出while循环,证明还能继续枚举,将该位++,以及ch数组中该位元素之后的每一位元素都比前一位大一个单位;若将该数组枚举完每一位都符合条件,
    则证明已无法向下枚举,跳出循环,结束程序。
      
  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11177767.html
Copyright © 2011-2022 走看看