朝日新聞2006年11月24日パズル横丁解答

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

find 1 2 5 6 4 3 
find 1 4 5 2 3 6 
find 1 5 3 4 2 6 

このうち下の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           val1 = a*100000 + b*10000 + c*1000 + d*100 + e*10 + f; // 右回りの7桁
  int           val2 = a*100000 + f*10000 + e*1000 + d*100 + c*10 + b; // 左回りの7桁
  if( (val1%7) != 0) return    NO; // 7の倍数か?
  if( (val2%7) != 0) return    NO;
  return    YES;
}

int main( int argc, cstring argv[])
{
  set<string>   vals;
  for( int a=1; a<= 1; a++) { // どの位置から取り出しても関係ないので1を天頂に固定して考える
    used[a] = YES;
    for( int b=1; b<= 6; b++) { // 他は1から6を考える。厳密には2からで良いがそこまでこだわらない
      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)) {
                // 重複を取り除く
                char    val1[6+1] = {a,b,c,d,e,f,NIL}; // 右回りの数字
                char    val2[6+1] = {a,f,e,d,c,b,NIL}; // 左回りの数字
                if( vals.find( val1) == vals.end()&& // どちらかが既に出現したか?
                    vals.find( val2) == vals.end()) {
                  ps( "find %d %d %d %d %d %d \n", a, b, c, d, e, f); // 今まで出現しなければ解
                  vals.insert(val1); // 出現済みを記録する
                  vals.insert(val2);
                }
              }
            }
            used[e] = NO;
          }
          used[d] = NO;
        }
        used[c] = NO;
      }
      used[b] = NO;
    }
    used[a] = NO;
  }
  return    0;
}