プログラムの実行結果は以下の通り。
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; }