暗号算術パズルを表す 3 つの文字列を取る C++ プログラムを計画しています。たとえば、TWO、TWO、および FOUR が与えられた場合、プログラムは、数式が
TWO
+ TWO
------
FOUR
は true で、入力は右揃えであると想定されます。これに対処する 1 つの方法は、もちろん、答えが最終的に見つかるまで、ネストされたループを使用して各文字に可能なすべての置換を割り当て、合計を繰り返し試行するなど、力ずくで実行することです。
これは非常に非効率的ですが、各変数のドメインを制限するために一連の演繹が実行された後、根底にあるループチェックは実行可能な (または必要でさえある) 方法である可能性があると思います。視覚化するのはちょっと難しいと思いますが、最初にこのような一般的な/パディングされた構造を想定するのが合理的でしょうか (各 X は必ずしも明確ではない数字を表し、各 C は桁上げ数字です。この場合、 0 または 1 のいずれかになります)? :
CCC.....CCC
XXX.....XXXX
+ XXX.....XXXX
----------------
CXXX.....XXXX
それを念頭に置いて、さらにいくつかの計画的な考えを以下に示します。
-問題では先頭のゼロは指定されませんが、オペランドを一致させる/一致させるために、適切な場所に十分な数を追加する必要があります。
-おそらく「ドメイン」テーブルにベクトルとして保存されている、各文字の可能な値0〜9のセットから始めて、控除が行われるときにこれから値を削除する必要があると考えています。たとえば、このように文字が並んでいるのを見たら
A
C
--
A
、 C がゼロであることがわかり、これにより、そのドメインから他のすべての値が削除されます。かなりの数の推論を思いつくことができますが、それらをあらゆる種類の小さな状況に一般化してコードに入れることは、一見すると難しいように思えます。
-物事を実行し、ドメインテーブルから多くの値を起動する一連の優れた推論があると仮定すると、すべてをループして、状態空間が合理的なソリューションを生成するのに十分小さいことを願っています時間の長さ。しかし、それ以上のものがあるはずだと感じています!-- 設定するための巧妙な方程式か、それに沿ったものかもしれません。
ヒントをいただければ幸いです。