atcoder ABC161 D - Lunlun Numberの勉強

atcoder.jp

・参考
AtCoder ABC 161 D - Lunlun Number (緑色, 400 点) - けんちょんの競プロ精進記録


・説明
 参考記事のように、再帰関数で実装した。最大10桁までのルンルン数を求めてallにルンルン数を入れていく。あとはソートしてK番目を出力する。
 また、再帰関数の次のルンルン数を求める部分は

for val in range(1,10):
  for j in range(-1,2):
    add=(val%10)+j
    print(val,j,add,val*10+add) #val*10+addがvalの1桁上のルンルン数になる。

#out
1 -1 0 10
1 0 1 11
1 1 2 12
2 -1 1 21
2 0 2 22
2 1 3 23
3 -1 2 32
3 0 3 33
3 1 4 34
4 -1 3 43
4 0 4 44
4 1 5 45
.
.
.
.

となり、次の桁のルンルン数がval*10+addになる。

・実装

#参考:https://drken1215.hatenablog.com/entry/2020/04/05/150900
k=int(input())

all=[]

def cal_runrun(d,val): #dが桁数
  all.append(val)
  
  #10桁までのルンルン数を求める
  if d==10:
    return
  
  #次のルンルン数を求める。valがルンルン数でval*10+addがvalの次の桁のルンルン数になる。
  #例えばvalが1で、val*10+addが10, 11, 12。
  for j in range(-1,2):
    add=(val%10)+j
    if 0<=add<=9:
      cal_runrun(d+1,val*10+add)
      
#main
for v in range(1,10):    
  cal_runrun(1,v)
all.sort()
print(all[k-1])