円卓の周りに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年ぶりに狂犬病患者が発症。噛まれたのは海外らしいけど,今だと犬に噛まれても狂犬病なんて考えもしないんだろうな。
私は小学生の時,野犬に噛まれて狂犬病かと心配になって保健所に検査に行った。
但し噛まれたのは覚えているけど,保健所に行った記憶が全然ない。
解速度
即