ある特定の駒を用いて,1手詰め将棋問題を列挙しようと考えています.
攻め手は,金2枚,受け手は玉1枚と残りの駒を持駒としています.
下記のプログラムでは,バックトラック法を用いて,4×4マスに利きを考えずに,駒を並べました.
ある盤面が詰んでいるのか詰んでいないのかを判定して,詰んでいる状態のみを表示したいと考えています.
c
1#include <stdio.h> 2#include <stdlib.h> 3enum KomaN {GYO, KYO, KEI, GIN, KIN, HSH, KAK, FU}; 4enum Dir {A_DIR, B_DIR, OWNED_A, OWNED_B}; 5 6 7 8typedef struct Koma { 9 enum KomaN nam; 10 int x; 11 int y; 12 enum Dir dir; 13} Koma; 14 15#define BOARD_SIZE 9 16#define MAX_KOMA 38 //最大の持ち駒 17 18int hantei(int dep); 19Koma * make_koma(enum KomaN nam, int x, int y, enum Dir dir); 20void init(); 21void printBoard(); 22int searchTsumi(int dep); 23 24 25Koma * board[BOARD_SIZE * BOARD_SIZE]; //盤の大きさ 26Koma * playerA[MAX_KOMA]; //先手の最大駒 27int NkomaA; //先手の持ち駒 28Koma * playerB[MAX_KOMA+1]; //後手の最大駒 29int NkomaB; //後手の持ち駒 30char *kname[] = {"GY", "KY", "KE", "GI", "KI", "HS", "KA", "FU"}; 31 32Koma * make_koma(enum KomaN nam, int x, int y, enum Dir dir){ 33 Koma *pt = malloc(sizeof(Koma)); 34 pt->nam = nam; 35 pt->x = x; 36 pt->y = y; 37 pt->dir = dir; 38 return pt; 39} 40 41void init() { 42 int i, j; 43 for (i = 0; i < BOARD_SIZE; i++){ 44 for (j = 0; j < BOARD_SIZE; j++){ 45 board[BOARD_SIZE * i + j] = NULL; //最初はNULLを埋めておく 46 } 47 } 48 NkomaA = 0; 49 NkomaB = 37; 50} 51 52//表示する 53void printBoard() { 54 int i, j; 55 char *shikiri = " +--+--+--+--+--+--+--+--+--+"; 56 printf(" 0 1 2 3 4 5 6 7 8\n"); 57 printf("%s\n", shikiri); 58 for (i = 0; i < BOARD_SIZE; i++) { 59 printf("%2d ", i); 60 for (j = 0; j< BOARD_SIZE; j++) { 61 Koma *pt = board[i * BOARD_SIZE + j]; 62 if (pt != NULL){ 63 printf("|%s", kname[pt->nam]); 64 } else { 65 printf("| "); 66 } 67 } 68 printf("|\n"); 69 printf("%s\n", shikiri); 70 } 71 printf("\n"); 72} 73 74int searchTsumi(int dep) { 75 int i, j; 76 int kk[] = {KIN, KIN, GYO}; 77 78 79 80 //深さが3になったら 81 if (dep >= 3){ 82 printBoard(); 83 } else { 84 for (i = 0; i < 4; i++) { 85 for (j = 5; j < 9; j++) { 86 if (board[i * BOARD_SIZE + j] != NULL) continue; 87 Koma *k = make_koma(kk[dep], i, j, A_DIR); 88 board[i * BOARD_SIZE + j] = k; 89 searchTsumi(dep + 1); 90 board[i * BOARD_SIZE + j] = NULL; 91 } 92 } 93 } 94} 95 96/* 詰んでいるかどうかの判定 */ 97int hantei(int dep) { 98 99 //玉の位置を特定 100 for (int i = 0; i < 4; i++) { 101 for (int j = 5; j < 9; j++) { 102 if(board[i * BOARD_SIZE + j]==GYO){ 103 kingE = i * BOARD_SIZE + j; 104 } 105 } 106 } 107} 108 109int main() { 110 init(); 111 searchTsumi(0); 112 return 0; 113}