指定の文字に0〜9までの何れかの数字を割り当て式を完成する。
同じ数字は二度使用してはならない。
数字の割り当て問題は 10!(=3,628,800) 回の虱潰し(しらみつぶし)問題である。
図中のグレーより先の枝は調べない。現在のコンピュータ能力を考えると,この程度の虱潰しはたいした問題ではなくなった。
虱潰しのためのプログラムは以下のようになる。
#include "puzutl.h" YesNo used[10]; int main( int argc, cstring argv[]) { int cnt = 0; for( int a=0; a< 10; a++) { used[a] = YES; for( int b=0; b< 10; b++) { if( used[b]) continue; used[b] = YES; for( int c=0; c< 10; c++) { if( used[c]) continue; used[c] = YES; for( int d=0; d< 10; d++) { if( used[d]) continue; used[d] = YES; for( int e=0; e< 10; e++) { if( used[e]) continue; used[e] = YES; for( int f=0; f< 10; f++) { if( used[f]) continue; used[f] = YES; for( int g=0; g< 10; g++) { if( used[g]) continue; used[g] = YES; for( int h=0; h< 10; h++) { if( used[h]) continue; used[h] = YES; for( int i=0; i< 10; i++) { if( used[i]) continue; used[i] = YES; for( int j=0; j< 10; j++) { if( used[j]) continue; used[j] = YES; cnt++; // ここに制約処理を書く used[j] = NO; } used[i] = NO; } used[h] = NO; } used[g] = NO; } 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; }
プログラムを実行すると
cnt:3628800
を出力する。