# このプログラムリストは、 # 「憂鬱なプログラマのためのオブジェクト指向開発講座」翔泳社 # の付録CD-ROMから引用したものです。 # 2003/10/27 前橋和弥 LIST14-1:C言語でのプログラム例 #include #define MAX 9 // マスの数 #define LINE 3 // 1行のマスの数 int nummgr [ MAX ] ; // すでに使われている番号の管理 main () { int mahou [ LINE ][ LINE ] ; // 魔法陣 int sum ; // 魔法陣の場合の1行の合計の数 // (3×3の場合は15) sum = MAX * ( MAX + 1 ) / 2 / LINE ; // 1行の合計算出 for ( int i = 0 ; i < MAX ; i ++ ) // 使われている番号管理初期化 { nummgr [ i ] = 0 ; } for ( int i1 = 1 ; i1 <= MAX ; i1 ++ ) // 1マス目 { if ( nummgr [ i1- 1] ) { // 使われている数字は飛ばす continue ; } else { mahou [ 0][ 0] = i1 ; // 1マス目に数字設定 nummgr [ i1 - 1] = 1 ; // この数は使われているということを設定 for ( int i2 = 1 ; i2 <= MAX ; i2 ++ ) { // 2マス目(以下同様) if ( nummgr [ i2- 1] ) { continue ; } else { mahou [ 0 ][ 1 ] = i2 ; nummgr [ i2 - 1] = 1 ; for ( int i3 = 1 ; i3 <= MAX ; i3 ++ ) { if ( nummgr [ i3- 1] ) { continue ; } else { mahou [ 0 ][ 2 ] = i3 ; nummgr [ i3 - 1] = 1 ; for ( int i4 = 1 ; i4 <= MAX ; i4 ++ ) { if ( nummgr [ i4- 1] ) { continue ; } else { mahou [ 1 ][ 0 ] = i4 ; nummgr [ i4 - 1] = 1 ; for ( int i5 = 1 ; i5 <= MAX ; i5 ++ ) { if ( nummgr [ i5- 1] ) { continue ; } else { mahou [ 1 ][ 1 ] = i5 ; nummgr [ i5 - 1] = 1 ; for ( int i6 = 1 ; i6 <= MAX ; i6 ++ ) { if ( nummgr [ i6- 1] ) { continue ; } else { mahou [ 1 ][ 2 ] = i6 ; nummgr [ i6 - 1] = 1 ; for ( int i7 = 1 ; i7 <= MAX ; i7 ++ ) { if ( nummgr [ i7- 1] ) { continue ; } else { mahou [ 2 ][ 0 ] = i7 ; nummgr [ i7 - 1] = 1 ; for ( int i8 = 1 ; i8 <= MAX ; i8 ++ ) { if ( nummgr [ i8- 1] ) { continue ; } else { mahou [ 2 ][ 1 ] = i8 ; nummgr [ i8 - 1] = 1 ; for ( int i9 = 1 ; i9 <= MAX ; i9 ++ ) { if ( nummgr [ i9- 1] ) { continue ; } else { mahou [ 2 ][ 2 ] = i9 ; nummgr [ i9 - 1] = 1 ; // 魔法陣かどうかチェック int ok = 1 ; for ( int x = 0 ; x < LINE ; x ++ ) { int tmp = 0 ; for ( int y = 0 ; y < LINE ; y ++ ) { // 縦の行のチェック tmp += mahou [ x ] [ y ] ; } if ( tmp != sum ) { // 15か? ok = 0 ; break ; } } if ( ok ) { // 縦の行がすべてOKの場合のみ for ( int y = 0 ; y < LINE ; y ++ ) { // 横の行のチェック int tmp = 0 ; for ( int x = 0 ; x < LINE ; x ++ ) { tmp += mahou [ x ] [ y ] ; } if ( tmp != sum ) { // 15か? ok = 0 ; break ; } } } // 魔法陣かどうかのチェック終わり // 画面表示処理 if ( ok ) { // 縦も横もすべて合計が15だったら画面表示 for ( int x = 0 ; x < LINE ; x ++ ) { for ( int y = 0 ; y < LINE ; y ++ ) { printf ( "%d ", mahou [ x ] [ y ] ); // 画面表示 } puts ("") ; } puts ( "" ) ; } // 画面表示処理終わり nummgr [ i9 - 1 ] = 0 ; // 番号管理部に数字を // 使っていないことを通知 } } nummgr [ i8 - 1 ] = 0 ; } } nummgr [ i7 - 1 ] = 0 ; } } nummgr [ i6 - 1 ] = 0 ; } } nummgr [ i5 - 1 ] = 0 ; } } nummgr [ i4 - 1 ] = 0 ; } } nummgr [ i3 - 1 ] = 0 ; } } nummgr [ i2 - 1 ] = 0 ; } } nummgr [ i1 - 1 ] = 0 ; } } return 0 ; }