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