/* 修正版 takaken 2003/4/22 */ /************************************************************************/ /* Nクイーン Version 4 */ /* */ /* 斜め2方向使用済検査方式、無駄検索の削除 */ /* */ /* 特徴 */ /* 左端だけ例外処理 */ /* サイズを可変に(30以下) */ /* 盤面は1次元整数型配列、y位置の入れ替えによる */ /* xの小さい方から、可能な場所を順次調べる */ /* 対象性は、8通りの可能な変換をし、最小の場合に採用 */ /* */ /************************************************************************/ #include #include #include #include #include /* takaken */ #define MAXBOARDSIZE 20 int boardsize; int answercount; int printflag; int board[MAXBOARDSIZE]; /* チェス盤 */ int sused[MAXBOARDSIZE*2-1]; /* /方向が使用済み */ int bused[MAXBOARDSIZE*2-1]; /* \方向が使用済み */ int first1, first2; /* takaken */ #define QUEEN 'Q' #define BLANK '.' #define TRUE 1 #define FALSE 0 int compareboard( int *b0, int *b1 ); int isunique( void ); void tryqueen( int x ); void tryqueen0( void ); void foundanswer( void ); void printboard( int *b ); int main( int argc, char **argv ); /*----------------------------------------------------------------------*/ /* 盤上の状態による大小比較 */ /*----------------------------------------------------------------------*/ int compareboard( int *b0, int *b1 ) { int x; for( x=0; x 0 ) return FALSE; } return TRUE; } /*----------------------------------------------------------------------*/ /* チェス盤の指定場所にクイーンを置けるか調べる */ /*----------------------------------------------------------------------*/ void tryqueen( int x ) { int u, y; for( u=x; ufirst2) continue; /* takaken */ sused[x-y+boardsize-1] = bused[x+y] = TRUE; board[u] = board[x]; board[x] = y; if( x+1 == boardsize ) { foundanswer(); } else { tryqueen( x+1 ); } sused[x-y+boardsize-1] = bused[x+y] = FALSE; board[x] = board[u]; board[u] = y; } } void tryqueen0( void ) { int u, y; for( u=0; u Total count %d %dsec\n", boardsize, answercount, time(NULL) - st); } return 0; } /************************************************************************/ /* End */ /************************************************************************/