题目描述
Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为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< span>,且不存在Jam数字P,使U<P<V< span>)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。
输入
有2行,第1行为3个正整数,用一个空格隔开:s t w
(其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T< span>≤26, 2≤w≤t-s )
第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。
输出
输出最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。
每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。
样例输入
2 10 5 bdfij
样例输出
bdghi bdghj bdgij bdhij befgh
从最后一位往前依次分情况考虑,先考虑最后一位是否还存在+1的可能性,如果存在就在原来的字符串最后一位加1,如果字符串最后一位已经到达最大限制(比如案例中字符串最后一位是j,而j已经是最大的字母),我们需要考虑前一位,同样考虑是否超过它的最大限制(只不过这个最大限制要比最后一位数的最大限制小1(也就是字符串倒数第二位的取值最大是i而不是j),因为整个字符串字母是单增的,前面的字母不能大于后面的字母),这样的话使用一个递归函数依次考虑每一位字符串的情况即可。
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long int LL;
char ch[100];
int s, t, w;
int cnt=5;
int length;
void dg(char ch[], int index,int heigh,bool flag) {/*第一个参数是存放字符串的数组,第二个参数是我们要考虑的字符串的位置下标,
第三个位置代表我们是否需要从最后一位重新开始遍历整个数组(比如输出案例中从第四个到第五个,不仅仅改了第二位,
而是把第二位后面的所有字符串都要重新更新一遍)
而第三个参数就是用来判别是否我们需要重新更新后面的字符的一个标志*/
if (cnt == 0 || index == -1)//结束条件,count初始值为5,index是字符串下标,分别代表我们已经找到5个数,和不够5个数,但是已经找到了所有的数
exit(0);
int k = ch[index] - 'a';
if (k < heigh-1) {//判断当前位的字母是否已经到达最大字母的限制
ch[index] = ch[index] + 1;//当前位字符串加1
if (flag) {//说明当前坐标后面的字母我们需要更新
while (index < length) {
ch[++index] = ch[index - 1] + 1;
}
cout << ch << endl;;
cnt--;
dg(ch, length,t, false);
}
cout << ch << endl;
cnt--;
dg(ch, index,heigh,false);
}
else {
dg(ch, index - 1, heigh - 1, true);/*说明当前下标的字符串已经到达最大限制,
我们需要考虑前一位字符串,并将flag设为true*/
}
}
int main() {
cin >> s >> t >> w;
scanf("%s", ch);
int len = strlen(ch)-1;//获取当前字符串的最大位置下标
length = len;//将字符串的长度给全局变量lengthcopy一份,我们要在递归函数里用到
dg(ch, len,t,false);
return 0;
}