朝日新聞2004年10月16日パズルパーク解答

プログラムの実行結果は以下の通り。

解:7
cnt:362880

結果を図示すると以下のようになる。

他の部分は組合せが複数ある。例えば以下の通り。

今回は灰色部分だけを求める問題で,他の部分は組合せが複数あるので,それらを出力するようにプログラムを作成しなかった。

ソースは以下の通り。

#include "puzutl.h"

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

int main( int argc, cstring argv[])
{
  int           cnt = 0;
  for( int a=1; a< 10; a++) {
    used[a] = YES;
    for( int b=1; b< 10; b++) {
      if( used[b]) continue;
      used[b] = YES;
      for( int c=1; c< 10; c++) {
        if( used[c]) continue;
        used[c] = YES;
        for( int d=1; d< 10; d++) {
          if( used[d]) continue;
          used[d] = YES;
          for( int e=1; e< 10; e++) {
            if( used[e]) continue;
            used[e] = YES;
            for( int f=1; f< 10; f++) {
              if( used[f]) continue;
              used[f] = YES;
              for( int g=1; g< 10; g++) {
                if( used[g]) continue;
                used[g] = YES;
                for( int h=1; h< 10; h++) {
                  if( used[h]) continue;
                  used[h] = YES;
                  for( int i=1; i< 10; i++) {
                    if( used[i]) continue;
                    used[i] = YES;
                    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;
                    }
                    cnt++;
                    used[i] = NO;
                  }
                  used[h] = NO;
                }
                used[g] = NO;
              }
              used[f] = NO;
            }
            used[e] = NO;
          }
          used[d] = NO;
        }
        used[c] = NO;
      }
      used[b] = NO;
    }
    used[a] = NO;
  }
  for( int z=1; z<= 9; z++) {
    if(find[z]) ps( "解:%d\n", z);
  }
  ps( "cnt:%d\n", cnt);
  return    0;
}