top>

テンパズル Ten Puzzle

テンパズルとは、
  「4つの数字と任意の四則演算を用いて計算結果を10にする」
というパズルです。累乗(指数)、ルートなどはダメ、カッコの使用はOKです。
電車の切符に印刷してある4桁の数字で暇つぶししたやつです。
これを、コンピュータで、すべての可能性を調べ、その結果を表示させるにはどうしたらいいでしょうか?

演算子は、4つの数字の間に入るので4×4×4=64通りの入り方が考えられます。
また、カッコの使用箇所は下記の5通り。
  (a*b)*c)*d
  (a*b)*(c*d)
  (a*(b*c))*d
  a*((b*c)*d)
  a*(b*(c*d))
最後に4つの数字の順列は、10個から4つ選ぶ重複順列ですから
  10×10×10×10=10,000通り
以上より全部で
64×5×10,000=3,200,000通りを調べれば終了です。

これをプログラムに直して実行すればいいのですが、、、
10,000通りのところはfor文で繰り返せばいいですが、64通りの部分はどうしましょうか。
64通りのところと5通りのところは、切り離せない雰囲気、、、やっぱ320行のプログラムを書くしかないのでしょうか?
どうも不満ですが、、、、
○C言語ソースリスト
○答え

一応、答えは出ましたが、どうもカッコ悪いです。もっとエレガントな方法はないのでしょうか?

最終更新:2011年9月6日

数字を1つずつ固定して解く

そもそもの問題は「4つの数字で10を作る」です。
これを、1つの数字aを固定して「aとXで10を作る」ことにします。
さらに、1つの数字bを固定して「bとYでXを作る」ことにします。
さらに、1つの数字cを固定して「cとdでYを作る」ことを考えます。

なんか再帰のにおいがしてきました。
ということで、まずは、「aとXで10を作る」ことだけ考えます。
このようなaとXの組み合わせを列挙するプログラムです。
出力結果は、以下のようなイメージです。
a=0
 10=0+10
   10=0-(-10)
   10=10-0
   10=0*falure
   10=0/falure
   10=falure/error
a=1
 10=1+9
   10=1-(-9)
   10=11-1
   10=1*10
   10=1/0.1
   10=10/1
a=2
   10=2+8
   10=2-(-8)
   10=12-2
   10=2*5
   10=2/0.2
   10=20/2
a=3
   10=3+7
   10=3-(-7)
   10=13-3
   10=3*(10/3)
   10=3/0.3
   10=30/3

top>
最終更新:2011年9月26日