プログラムの出力結果は以下の通り。2件出力されているが,XとYが逆になっているだけなので実質1件。
X: 2 3 6 7 Y: 1 4 5 8 10 X: 1 4 5 8 10 Y: 2 3 6 7
プログラムのソースは以下の通り。
#include "puzutl.h" YesNo ok[1024]; int bit[9] = {1,2,4,8,16,32,64,128,256}; int num[9] = {1,2,3,4, 5, 6, 7, 8, 10}; void create_okng() { // 1,2,3,4,5,6,7,8,10 から任意の3個を取り出す場合の組合せと,その組合せで問題ないか事前に調べておく。 for( int a=0; a< 9; a++) { for( int b=a+1; b< 9; b++) { for( int c=b+1; c< 9; c++) { int v = bit[a]|bit[b]|bit[c]; // 3個を取り出したときの数値 if( num[c] - num[b] == num[b] - num[a]) ok[v] = NO; else ok[v] = YES; } } } } YesNo checkOk( int x) { // Boxに入っている数字から任意に3個取り出し差分に問題がないか調べる。 // 事前にこの組合せがOKかどうか調べておく。 for( int a=0; a< 9; a++) { for( int b=a+1; b< 9; b++) { for( int c=b+1; c< 9; c++) { int v = bit[a]|bit[b]|bit[c]; // 3個を取り出したときの数値 if( (x&v) == v) { // 3個の数値の組合せがなければ調べる意味が無い if( ok[v] == NO) return NO; // 事前に調べておいた3個の数字の組合せではダメである } } } } return YES; } int main( int argc, cstring argv[]) { create_okng(); // Box X に入れる組合せは全部で512通りある。 // Box Y は Box X に入れた数字以外の数字を入れる。 int X, Y; for( int i=0; i< 512; i++) { X = i; Y = ~X; if( checkOk(X) && checkOk(Y)) { ps( "X: "); for( int i=0; i< 9; i++) { if( X&bit[i]) ps( "%d ", num[i]); } ps( "\nY: "); for( i=0; i< 9; i++) { if( Y&bit[i]) ps( "%d ", num[i]); } ps( "\n"); } } return 0; }