プログラムの出力結果は以下の通り。
Find A:10, B: 4, C: 8, D: 0, E: 2, F: 6, G: 4 Find A:10, B: 4, C: 8, D: 0, E: 2, F: 6, G: 4 Find A: 8, B: 4, C:10, D: 2, E: 0, F: 4, G: 6 Find A: 8, B: 4, C:10, D: 2, E: 0, F: 4, G: 6 cnt:5040
4件出力されているが上2件,下2件は同じ。
これはネズミが2匹いたため。上2件と下2件は左右が対称の結果なので,実質1件。
図示すると以下の通り。
プログラムは以下の通り。
#include "puzutl.h" YesNo used[7]; int nleg[7] = { 10, 8, 6, 2, 0, 4, 4 }; // イカ,蛸(タコ),甲虫(カブトムシ),雀(スズメ),蛇(ヘビ),鼠(ネズミ),鼠(ネズミ)の足の数 int main( int argc, cstring argv[]) { int cnt = 0; for( int a=0; a< 7; a++) { used[a] = YES; for( int b=0; b< 7; b++) { if( used[b]) continue; used[b] = YES; for( int c=0; c< 7; c++) { if( used[c]) continue; used[c] = YES; for( int d=0; d< 7; d++) { if( used[d]) continue; used[d] = YES; for( int e=0; e< 7; e++) { if( used[e]) continue; used[e] = YES; for( int f=0; f< 7; f++) { if( used[f]) continue; used[f] = YES; for( int g=0; g< 7; g++) { if( used[g]) continue; int n1 = nleg[a] + nleg[d]; int n2 = nleg[b] + nleg[d] + nleg[f] ; int n3 = nleg[f] + nleg[g] ; int n4 = nleg[b] + nleg[e] + nleg[g] ; int n5 = nleg[c] + nleg[e] ; if( n1 == n2 && n2 == n3 && n3 == n4 && n4 == n5) { ps( "Find A:%2d, B:%2d, C:%2d, D:%2d, E:%2d, F:%2d, G:%2d\n", nleg[a], nleg[b], nleg[c], nleg[d], nleg[e], nleg[f], nleg[g]); } cnt++; } used[f] = NO; } used[e] = NO; } used[d] = NO; } used[c] = NO; } used[b] = NO; } used[a] = NO; } ps( "cnt:%d\n", cnt); return 0; }