(切符に4桁の数字が印刷されていたから、このような名称がついているらしいです。)
例:「1357」ならば、答えは「1+5+7-3」とか「(7-1)*5/3」などとなります。
このように、4つの数字が与えられたときに、切符パズルの答えを列挙するプログラムを作りました。
ソースコードを、一部だけ記載します。
【ticket_puzzle.h】
#pragma once
namespace a5ua
{
void ticket_puzzle(const int (&numbers)[4]);
void ticket_puzzle(const char *numbers_str);
}
#include
#include "ticket_puzzle.h"
int main()
{
const char *A[2] = {"3478", "****"};
const int B[2][4] = {{1, 1, 5, 8}, {-1, 0, 1, 2}};
a5ua::ticket_puzzle(A[0]); std::cout << "\n";
a5ua::ticket_puzzle(A[1]); std::cout << "\n";
a5ua::ticket_puzzle(B[0]); std::cout << "\n";
a5ua::ticket_puzzle(B[1]); std::cout << "\n";
return 0;
}
変な入力に対しては、エラーとなります。
[codeplain]
(3-(7/4))*8
8*(3-(7/4))
invalid arguments
8/(1-(1/5))
invalid arguments
[/code]
考え方としては、
・4つの数字の並べ方は、4! = 24通り
・4つの演算子から、3つを選ぶ並べ方は、4^3 = 64通り
・括弧のつけ方が、以下の5通り(□には、{+, -, *, /}のいずれかが入ります)
・((a□b)□c)□d
・(a□(b□c))□d
・(a□b)□(c□d)
・a□((b□c)□d)
・a□(b□(c□d))
したがって、全部で、24*64*5 = 7680通りを調べています。
(本当はもっと効率よくできます。例えば、「A+B」と「B+A」は同じなど)
全体のソースコードをアップロードしておきます。
有理数計算が必要だったので、思ったより長くなってしまった。
プログラム作成環境はVisual C++ 2008 Express Editionです。
http://www1.axfc.net/uploader/Sc/so/165976.zip&key=mixC