はぁ……

新たな関数を一つ作ってみた。
問題無く動くのだけど、上手く機能しない。
意味不明。

これだからプログラミングは嫌いなんだ。


// frame_kouho[ 3 ][ 9 ]の初期化
void Frame2LineInit(){
int i, j;

for( I3LOOP ){
for( J9LOOP ){
frame_kouho[ i ][ j ] = true;
}
}

return;
}

// 大枠内の候補の検索、削減
void Frame2LineSearch( int i, int j3, bool flag ){
int k ,l, m;

// 大枠内の行(列)の組み合わせを指定するための変数
int k1, k2, k3;

bool frame_search[ 9 ];

for( K3LOOP ){
switch( k ){
// 大枠内の行(列)の組み合わせの指定
case 0:
k1 = 0;
k2 = 1;
k3 = 2;
break;

case 1:
k1 = 0;
k2 = 2;
k3 = 1;
break;

case 2:
k1 = 1;
k2 = 2;
k3 = 0;
break;

default:
break;
}

// frame_search[ 9 ]の初期化
for( L9LOOP ){
frame_search[ l ] = true;
}

fprintf( file, "%d\n", k );

for( L9LOOP ){
// fprintf( file, "k1:frame_kouho[ %d ][ %d ]:%d\n", k1, l, frame_kouho[ k1 ][ l ] );
// fprintf( file, "k2:frame_kouho[ %d ][ %d ]:%d\n", k2, l, frame_kouho[ k2 ][ l ] );
// fprintf( file, "k3:frame_kouho[ %d ][ %d ]:%d\n", k3, l, frame_kouho[ k3 ][ l ] );

// ( x and y ) and NOT z で2列に存在し、1列には存在しない候補を選出できる
frame_search[ l ] = frame_kouho[ k1 ][ l ] & frame_kouho[ k2 ][ l ] & !frame_kouho[ k3 ][ l ];
}

for( L3LOOP ){
for( M9LOOP ){
// 更新
if( flag == true ){ // trueは行方向を調べる
candi[ TUPLE ][ j3 * 3 + l ][ m ] &= !frame_search[ m ];
// fprintf( file, "&candi[ %d ][ %d ][ %d ]:%d\n", i * 3 + k3, j3 * 3 + l, m, candi[ i * 3 + k3 ][ j3 * 3 + l ][ m ] );
}
else{
// fprintf( file, "#candi[ %d ][ %d ][ %d ]:%d\n", j3 * 3 + l, TUPLE, m, candi[ j3 * 3 + l ][ TUPLE ][ m ] );
candi[ j3 * 3 + l ][ TUPLE ][ m ] &= !frame_search[ m ];
// fprintf( file, "$candi[ %d ][ %d ][ %d ]:%d\n", j3 * 3 + l, TUPLE, m, candi[ j3 * 3 + l ][ TUPLE ][ m ] );
}
}
}
}

return;
}

// 大枠内の候補の削減、ループ
bool Frame2LineLoop( bool flag ){
int i, j, k, l;

// J3LOOP用の調べる組み合わせを指定する変数
int j1, j2, j3;

fprintf( file, "大枠内の候補の削減:%d\n", flag );

// 同一行(列)の大枠内の同一行(列)の論理積を取る
for( I3LOOP ){
for( J3LOOP ){
// 候補の初期化
Frame2LineInit();

// 列(行)の組み合わせの指定
switch( j ){
case 0:
j1 = 0;
j2 = 1;
j3 = 2;
break;

case 1:
j1 = 0;
j2 = 2;
j3 = 1;
break;

case 2:
j1 = 1;
j2 = 2;
j3 = 0;
break;

default:
break;
}

for( K3LOOP ){
for( L9LOOP ){
if( flag == true ){ // trueは行方向を調べる
// 組み合わせる大枠2つの3行(列)全てに数字が入るかどうかを調べる
// いずれか一方だけでも3行(列)全てに数字が入る可能性があれば失敗する
if( ( ( frame_tuple[ i ][ j1 ][ 0 ][ l ]
&& frame_tuple[ i ][ j1 ][ 1 ][ l ]
&& frame_tuple[ i ][ j1 ][ 2 ][ l ] ) == false )
&& ( frame_tuple[ i ][ j2 ][ 0 ][ l ]
&& frame_tuple[ i ][ j2 ][ 1 ][ l ]
&& frame_tuple[ i ][ j2 ][ 2 ][ l ] ) == false ) {
frame_kouho[ k ][ l ] = frame_tuple[ i ][ j1 ][ k ][ l ] & frame_tuple[ i ][ j2 ][ k ][ l ];
}
}
else{
// 組み合わせる大枠2つの3行(列)全てに数字が入るかどうかを調べる
// いずれか一方だけでも3行(列)全てに数字が入る可能性があれば失敗する
if( ( ( frame_column[ j1 ][ i ][ 0 ][ l ]
&& frame_column[ j1 ][ i ][ 1 ][ l ]
&& frame_column[ j1 ][ i ][ 2 ][ l ] ) == false )
&& ( frame_column[ j2 ][ i ][ 0 ][ l ]
&& frame_column[ j2 ][ i ][ 1 ][ l ]
&& frame_column[ j2 ][ i ][ 2 ][ l ] ) == false ) {
frame_kouho[ k ][ l ] = frame_column[ j1 ][ i ][ k ][ l ] & frame_column[ j2 ][ i ][ k ][ l ];
// fprintf( file, "frame_kouho[ %d ][ %d ]:%d\n", k, l, frame_kouho[ k ][ l ] );
}
}
}
}

// 検索、削減処理は独立
Frame2LineSearch( i, j3, flag );
}
}

return Result();
}

// 2つの大枠内の同一の2行(列)にのみ存在する候補は残り1つの大枠内のその2行(列)の候補から外せる
/*------------------------------------------------------------------------
+---+---+---+
| | | |
| a |bbb| a |
| a |bbb| a |
+---+---+---+
aのマスにしか入らない数があるなら、
bのマスに候補として挙がっているaは全て抹消できる
//------------------------------------------------------------------------*/
bool Frame2Line(){
// 大枠ごとの行(列)を最新の状態に更新する
FrameLineInit();

// 行方向を調べる
if( Frame2LineLoop( true ) == true ) return true;

// 列方向を調べる
if( Frame2LineLoop( false ) == true ) return true;

return false;
}

はいはい。
ソースコードがカオス過ぎるのが悪いんですね。
でもこれどうすればもっと読みやすいコードになるのかさっぱり分からんのですよ。