欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

问题 E: 【排列组合问题】Jam的计数法

程序员文章站 2022-05-21 23:05:40
...

有一种隐忍其实是蕴藏着的一种力量,有一种静默其实是惊天的告白。

题目描述

囚犯之间的秘密交流使用一种被称为Jam的计数法,这种计数法不使用阿拉伯数字计数,而是使用小写英文字母计数,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。在 Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam计数法还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f, g,h,i,j}这些字母。如果再规定位数为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个小写字母组成的字符串,不要有多余的空格。

 

样例输入

复制样例数据

2 10 5
bdfij

样例输出

bdghi
bdghj
bdgij
bdhij
befgh

这个题交了两遍,都是答案错误,实在找不出哪里出了错,最后想着可能是不能用getchar()读取字符???然后,就换了一种输入方式果断通过。。。。。。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <complex>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
#define inf 0x3f3f3f3f
typedef long long ll;
char ss[50];
int a[50];
using namespace std;
int main(){
    int s,t,w,i,j,x;
    scanf("%d%d%d%s",&s,&t,&w,ss+1);//s为最小的字母序号,t为最大的字母序号,w为数字的位数
    for(i=1;i<=w;i++)
        a[i]=ss[i]-'a'+1;
//    for(i=1;i<=w;i++)
//        cout<<ss[i]<<' '<<a[i]<<endl;
    for(i=1;i<=5;i++){
        x=-1;
        for(j=w;j>=1;j--){
            if(a[j]!=t-w+j){
                x=j;
                break;
            }
        }
            if(x<0)
                break;
            a[x]++;
            for(j=x+1;j<=w;j++)
                a[j]=a[j-1]+1;
            for(j=1;j<=w;j++)
                printf("%c",a[j]+'a'-1);
            printf("\n");
    }
    return 0;
}