因为刚开始不太会写,参考了这篇博客,然后转成python
https://blog.csdn.net/u014788620/article/details/84590303
题目:
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,且不存在Jam数字 P,使U〈P〈V)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就 输出几个。
input
2 10 5
bdfij
output
bdghi
bdghj
bdgij
bdhij
befgh
解释一下啥意思,刚开始我居然没看懂题目。。。。
其实就是jam给一些连续的字母,然后再给一个起始“数”,拿这些字母来组成一系列的严格递增的“数”
例如:
输入 2,10,5
这里的2和10对应着26个字母,所以就是b和j,b到j之间有c、d、e、f、g、h、i
然后从这9个字母中取5个字母组成“数”
比如,bdfij
然后他后面紧跟着的是bdghi,为啥是这个呢,
先看一下另一组:
bdghj bdgij
其实是从最后一位,也就是个位,开始比较,上面两个,个位都是j,而且都是最大的一个字母了,所以后一个比前一个大只能十位比前一个大,h<i,所以变为i
所以在编程时从最后一位开始看,如果最后一位最大,则往前面开始找。
注意的是,某一位确定之后,后面的应比其大(递增状态)
步骤:
判断末尾位是否最大
如果不是,就直接加一
如果是,则看倒数第二位是否是最大(注意这里的最大,是倒数第二位的最大,倒数第二位的最大,比倒数第一位的最大少一,也就是说,如果最后一位是j,则倒数第二位的最大应该是i)
如果倒数第二位不是最大,就加一,同时,倒数第一位的值应比倒数第二位大一
如果是最大,则继续向前看【可以看到,如果某一位是最大的时候,就一直向前找,这里就开始了递归】
s = 2
t = 10
w = 5
def Jams_count(num,index,heigh,flag,count):
if count == 5 or index==-1:
exit(0) #注意这里是exit,而不是return,用return的话是返回上一个调用它的函数
k=ord(num[index])-97 #这里是计算当前位置的字母对应的索引
if k<heigh-1: #比较是否是当前位置的最大
num[index]=chr(ord(num[index])+1) #如果不是最大,则就可以直接加一
if flag: #判断是否需要对后一位进行改变
while index<w-1: #如果需要改变,则后面每一位,都比前一位大一
index+=1
num[index]=chr(ord(num[index-1])+1)
print(num) #完成更改后打印jam数
count+=1 #这里是因为题目要求打印5个,在这里记录一下个数
Jams_count(num,w-1,t,False,count) #然后继续从最末端开始看
print(num) #如果不需要更改,则直接改变末尾位之后就打印出来
count+=1 #计数加一
Jams_count(num,index,heigh,False,count) #然后再继续从当前位开始看
else:
Jams_count(num,index-1,heigh-1,True,count) #如果当前位是当前位可取的最大值,则往前看
if __name__=='__main__':
# s=int(input())
# t=int(input())
# w=int(input())
# num=[]
# for i in range(w):
# num.append(input())
# s=2
# t=10
# w=5
num='bdfij'
num=list(num)
count=0
index=w-1
Jams_count(num,index,t,False,count)