[BOJ]4演算(no.14395)
質問する
整数sを与えます.整数sの値をtに変換する最小演算回数を求めるプログラムを作成する.
使用可能な演算は次のとおりです.
s = s + s; (出力:+)
s = s - s; (出力:-)
s = s s; (出力:)
s = s/s; (出力:/)(sが0でない場合のみ使用可能)
入力
最初の行はsとtを与える.(1 ≤ s, t ≤ 109)
しゅつりょく
1行目に整数sをtに変換する方法を出力します.sとtが同じ場合は0を出力し、できない場合は−1を出力する.可能な方法が複数ある場合、出力は辞書順にリードします.
演算するアスキーコードの順序は「*」、「+」、「-」、「/」である.
🤔 の意見を打診
優先順位のあるbfs!
問題の演算子順にif文を並べます.
マイナスの場合は考えなくてもいいです.(s,tはいずれも1より大きい範囲を指定しているので、0を作成する必要はなく、最小値である可能性もありません.)
どのような順序で演算されているかを覚えておくため、キューにも演算子配列を1つ入れればよい.
キャッシュ配列の範囲は明確ではなく,s,tの最大範囲は10の9乗であるため,配列でキャッシュチェックを行うことはできない.(集合を使えばいい!)
📌 説明する
import sys
input = sys.stdin.readline
def main():
def bfs(s,t):
if s == t: return 0
bound = 10e9
cache = {s}
q = [(s, "")]
cnt = 0
while q:
tmp = []
for i,hist in q:
if i == t: return hist
if (op := i*i) <= bound and op not in cache:
tmp.append((op, hist+"*"))
cache.add(op)
if (op := i+i) <= bound and op not in cache:
tmp.append((op, hist+"+"))
cache.add(op)
if (op := 1) not in cache:
tmp.append((op, hist+"/"))
cache.add(op)
cnt += 1
q = tmp
return -1
s,t = map(int, input().split())
print(bfs(s,t))
if __name__ == "__main__":
sys.exit(main())
レビュー
Reference
この問題について([BOJ]4演算(no.14395)), 我々は、より多くの情報をここで見つけました https://velog.io/@wisepine/BOJ-4연산-no.14395テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol