朝日新聞2006年11月24日のパズル横丁問題

問題

円卓の周りに1〜6の数字が等間隔で配置されている。

どの数字から左回り,右回り何れか6桁を取り出しても7の倍数となるパターンが3通りある。

以下の2つ以外のパターンを見つける。

解答への道(ヒント)

ポイントは以下の2つ。

数字は一つずつしか使えないので数字の割り当てを利用する。

#include "puzutl.h"

YesNo used[1+6];

YesNo val7( int a, int b, int c, int d, int e, int f) // 右回り,左回りの6桁が7の倍数か?
{
 ………
}
 
int main( int argc, cstring argv[])
{
  set<string>   vals;
  for( int a=1; a<= 6; a++) {
    used[a] = YES;
    for( int b=1; b<= 6; b++) {
      if( used[b]) continue;
      used[b] = YES;
      for( int c=1; c<= 6; c++) {
        if( used[c]) continue;
        used[c] = YES;
        for( int d=1; d<= 6; d++) {
          if( used[d]) continue;
          used[d] = YES;
          for( int e=1; e<= 6; e++) {
            if( used[e]) continue;
            used[e] = YES;
            for( int f=1; f<= 6; f++) {
              if( used[f]) continue;
              if( val7(a,b,c,d,e,f) && // 6桁の数字が7の倍数か?
                  val7(b,c,d,e,f,a) &&
                  val7(c,d,e,f,a,b) &&
                  val7(d,e,f,a,b,c) &&
                  val7(e,f,a,b,c,d) &&
                  val7(f,a,b,c,d,e)) {
                発見
              }
            }
            used[e] = NO;
          }
          used[d] = NO;
        }
        used[c] = NO;
      }
      used[b] = NO;
    }
    used[a] = NO;
  }
  return    0;
}

これだと重複して解が沢山出力されてしまう。数字の1に注目して考えるとどの位置にあっても良いのだから1を天頂に固定して考える。

よって最初のループを1〜6でなく,1だけにする。

それでも解は6個出力される。重複を除くため右回り,左回りの数字を文字列として検出する。

これで出力は3件に絞られた。このうち2件が問題文で指摘された数字の組み合わせ。

残り一つが解答。

 

国内で36年ぶりに狂犬病患者が発症。噛まれたのは海外らしいけど,今だと犬に噛まれても狂犬病なんて考えもしないんだろうな。

私は小学生の時,野犬に噛まれて狂犬病かと心配になって保健所に検査に行った。

但し噛まれたのは覚えているけど,保健所に行った記憶が全然ない。

解速度