/**********************************************************************/ /* Cmagazine 1995.12 電脳クラブ */ /* 標 題 Fペントミノ */ /* */ /* 解 答 1 通り */ /* */ /* 使用機種 FMR-50NL (i486sx 25MHz) */ /* O S MS-DOS Ver6.2 */ /* コンパイラ LSI C-86 Ver3.30C(試食版) */ /* 実行時間 12.5 秒 */ /* */ /**********************************************************************/ #include #include #include #include /* Fペントミノの回転裏返しの8パターン */ int fpent[8][3][3] = { /* +-----+-----+ +--+--+--+ */ 1,12, 0, 0,11, 4, 0, 2, 0, /* 例==>| | | ==> | 1|12| 0| */ 0, 8, 0, 9, 7, 4, 2, 0, 0, /* | 1|4 | +--+--+--+ */ 0, 8, 0, 1,14, 0, 0, 3, 4, /* | | 8 | | 0|11| 4| */ 0, 0, 8, 1,13, 6, 0, 2, 0, /* +-----+-----+-----+ +--+--+--+ */ 0, 9, 4, 1,14, 0, 0, 2, 0, /* | 2 | | | 0| 2| 0| */ 0, 8, 0, 1, 7,12, 0, 0, 2, /* | 1|4 | +--+--+--+ */ 0, 8, 0, 0,11, 4, 1, 6, 0, /* | 8 | | */ 8, 0, 0, 3,13, 4, 0, 2, 0 }; /* +-----+-----+ 4辺に2進 */ /* | 2 | 数の重みを付 */ /* | | け辺の接する */ /* | | 値の合計値で */ /* +-----+ マスを表わす */ int board[8][8]; /* 8×8のボード */ int anser[3][8][8]; /* 解答パターン */ int gaps; /* 確定した隙間数 */ int gapscut; /* 枝刈用隙間数 */ int mode; /* 処理モード */ int count; /* 解答の個数 */ /* ボードを裏返す */ void reverse(int workA[8][8], int workB[8][8]) { int x, y, w; for (y=0; y<8; y++) for (x=0; x<8; x++) workB[y][7-x] = ((w=workA[y][x])&10) | ((w&1)<<2) | ((w&4)>>2); } /* ボートを90度回転する */ void rotation(int workA[8][8], int workB[8][8]) { int x, y, w; for (y=0; y<8; y++) for (x=0; x<8; x++) workB[7-x][y] = (((w=workA[y][x])<<1)&15) | ((w&8)>>3); } /* 同形比較関数(0:なし 1:あり) */ int judge(int work[8][8]) { int i; for (i=0; i