朝日新聞2004年10月16日のパズルパーク問題

問題

以下の式を満たすように□に1から9の数字を入れる。このとき灰色部分に入る数字は何か?

解答への道(ヒント)

1から9と聞いたら数字の割り当て問題で解くと良い。パブロフの犬だな。1〜9なので,jのループを削り,数字は1から開始する。

以下のように文字を割り当てる。

条件判定部分は以下のようになる。

int x = a*b*c*d;
int y = e*f*g*h;
int z = i;
if( x % y == 0 && x / y + z == 17) {
  ps( "Find (%d*%d*%d*%d)/(%d*%d*%d*%d)+%d=17\n", a, b, c, d, e, f, g, h, i);
}
しかしこれだと答えが沢山出てきてしまう(並べ替えを考慮しなければそれほど沢山でもないか)。

 うーん,何か拙いのか?

よく見ると灰色の部分はある数字しか出力されないようだ。 プログラムを改良し,灰色部分に出現する数字だけを調べるようにする。

YesNo find[10]; // 出現した数字

ループの中の条件判定部分は以下のように変更する。

int x = a*b*c*d;
int y = e*f*g*h;
int z = i;
if( x % y == 0 && x / y + z == 17) {
  //ps( "Find (%d*%d*%d*%d)/(%d*%d*%d*%d)+%d=17\n", a, b, c, d, e, f, g, h, i);
  find[z]=YES;
}

最後にfind[ ]を調べるループを作成し,YESの時のINDEX値を出力する。

for( int z=1; z<= 9; z++) {
  if(find[z]) ps( "解:%d\n", z);
}

答えは1つ出力された。

解速度