アルファコード(DFS)


作成日:2022年2月12日午後4:11

インプリメンテーションコード

# 알파코드 (DFS)
import sys
#sys.stdin = open("in2.txt", "rt")

def numToChr(num):
    return chr(num+64)

def DFS(L, pre):
    global cnt
    if L == len(code):
        if pre == 0:
            for x in res:
                if x != "":
                    print(x, end='')
            print()
            cnt += 1
    else:
        if pre == 0 and code[L] != 0:
            #채택
            res[L] = numToChr(code[L])
            DFS(L+1, 0)
            res[L] = ""
            #채택x
            DFS(L+1, code[L])
        else:
            if 10*pre+code[L] > 26:
                pass
            else:
                if pre != 0:
                    #무조건 채택
                    res[L] = numToChr(10*pre+code[L])
                    DFS(L+1, 0)
                    res[L] = ""

if __name__ == "__main__":
    code = list(map(int,list(input())))
    res = [""]*len(code)
    cnt = 0
    DFS(0, 0)
    print(cnt)

模範解答

import sys
sys.stdin=open("input.txt", "r")
def DFS(L, P):
    global cnt
    if L==n:
        cnt+=1
        for j in range(P):
            print(chr(res[j]+64), end='')
        print()
    else:
        for i in range(1, 27):
            if code[L]==i:
                res[P]=i
                DFS(L+1, P+1)
            elif i>=10 and code[L]==i//10 and code[L+1]==i%10:
                res[P]=i
                DFS(L+2, P+1)

if __name__=="__main__":
    code=list(map(int, input()))
    n=len(code)
    code.insert(n, -1)
    res=[0]*(n+3)
    cnt=0
    DFS(0, 0)
    print(cnt)

差異

  • で私が実現したDFS関数では、preパラメータですぐにL数字を文字に変換するのではなく、L数字を次に変換し、L+1数字と併せて文字に変換した場合に数を求めました.
  • の模範解答では,1から26の数字(文字で計算するとA~Z)を複文ループでコード中のL数字と比較する.
  • iがLに等しい場合はres(1桁のみ)に追加し、iが2桁の場合はLと1桁を比較し、Lと2桁が同じ場合はresに追加し、次のパラメータは2つのスペース(2桁のため)
  • をスキップします.
    例えば、
  • は、コードが251114の場合、L=0の場合、iは2の場合、resにB、iは25の場合、Lの2番目の数字2とL+1の数字5の合計を追加するので、resにY(25を文字に変更)を追加し、2つのスペースをスキップして再帰関数を呼び出す.