/************************************************************/ /* ブラックボックス 2002/08/15 takaken */ /************************************************************/ #include #include #include // 0:オリジナルルール 1:majorさん独自ルール #define ROULE 0 ////////////////////////////////////////////////////////////// #define FALSE 0 #define TRUE 1 #define BOARD_SIZE 100 #define BALL 33 #define XX 34 // ボールの個数 int BALL_CNT; // 探索ボード int BOARD[BOARD_SIZE] = { XX,32,31,30,29,28,27,26,25,XX, 1, 0, 0, 0, 0, 0, 0, 0, 0,24, 2, 0, 0, 0, 0, 0, 0, 0, 0,23, 3, 0, 0, 0, 0, 0, 0, 0, 0,22, 4, 0, 0, 0, 0, 0, 0, 0, 0,21, 5, 0, 0, 0, 0, 0, 0, 0, 0,20, 6, 0, 0, 0, 0, 0, 0, 0, 0,19, 7, 0, 0, 0, 0, 0, 0, 0, 0,18, 8, 0, 0, 0, 0, 0, 0, 0, 0,17, XX, 9,10,11,12,13,14,15,16,XX }; // 光の入出力テーブル int PROB_CNT; int INP[32], OUT[32]; // 解の記録 int RESULT; int RECORD[BOARD_SIZE]; // 方向テーブル(座標変位) int DIFF[8] = {-10,-9, 1,11,10, 9,-1,-11}; // 入出力ナンバー -> 座標 int POS[33] = { 0, 10,20,30,40,50,60,70,80, 91,92,93,94,95,96,97,98, 89,79,69,59,49,39,29,19, 8, 7, 6, 5, 4, 3, 2, 1 }; // 入出力ナンバー -> 初期進行向き int VECT[33] = { 0, 2,2,2,2,2,2,2,2, 0,0,0,0,0,0,0,0, 6,6,6,6,6,6,6,6, 4,4,4,4,4,4,4,4 }; // 反復深化用 int MAX_DEPTH; int USED[33]; /************************************************************/ /* 解の表示 */ /************************************************************/ void Display(void) { int pos; for (pos=0; pos 32) return inp; } return FALSE; } int BlackBox(int already) { int inp, retc; // 現状を調査する retc = Solver(already); if (retc == 0) return -1; if (retc == 1) return 0; // 反復深化 for (MAX_DEPTH=already+1; ; MAX_DEPTH++) { printf("%d ", MAX_DEPTH); inp = MinMax(already); if (inp) break; } printf("\n"); return inp; } /************************************************************/ /* インターフェース */ /************************************************************/ int main(void) { int already, retc; time_t st = time(NULL); // ボールの個数 BALL_CNT = 5; // 既に入射した回数とその入口と出口 already = 13; INP[ 0]= 2; OUT[ 0]= 0; INP[ 1]= 4; OUT[ 1]= 0; INP[ 2]= 6; OUT[ 2]=14; INP[ 3]=15; OUT[ 3]=15; INP[ 4]=17; OUT[ 4]= 0; INP[ 5]=18; OUT[ 5]= 0; INP[ 6]=19; OUT[ 6]=19; INP[ 7]=25; OUT[ 7]=21; INP[ 8]=26; OUT[ 8]=26; INP[ 9]=27; OUT[ 9]= 0; INP[10]=28; OUT[10]=28; INP[11]=29; OUT[11]= 0; INP[12]=30; OUT[12]= 0; // 探索と結果表示 retc = BlackBox(already); switch (retc) { case -1: printf("解がありません.\n"); break; case 0: printf("解が見つかりました.\n"); Display(); break; default: printf("次の%d手目は位置%dに光を当てて下さい.\n", already+1, retc); printf("最短%d手以内に解が見つかります.(%dsec)\n", MAX_DEPTH, time(NULL)-st); } return 0; }