/* *** crock.c: 「マスの問題」:(探索エンジン使用:未完成・穴埋め版) *** */ #include "search.c" #define MAXC 30 // マスの容量の最大値 int A, B; // マス A, B の容量 int v; // 量りとる値 struct CROCK { // 状態ノード:水量を index とする2次元配列 int a, b; // マス A, B に入っている水量 int len; // ここまでの最短経路長 } crock[MAXC+1][MAXC+1]; void init() // 初期設定 { int i, j; for (i=0; i<=A; i++) for (j=0; j<=B; j++) { crock[i][j].a = i; crock[i][j].b = j; crock[i][j].len = (A+1)*(B+1)+1;// 初期値は可能な最大値+1 } crock[0][0].len = 0; // 初期ノード } int node_status(node, len, next_nodes) struct CROCK *node, **next_nodes; int len; { int a = node->a, b = node->b; int n=0; if ((a == v) || (b == v)) return(SUCCESS); if (node->len < len) return(FAILURE); node->len = len; next_nodes[n++] = ... // ここの箇所の穴埋めを行う。 ... return(n); } void main(argc, argv) int argc; char **argv; { int i, n, len; struct CROCK **ans; if (argc != 4) { fprintf(stderr, "usage: %s v A B\n", argv[0]); fprintf(stderr, "\tv : %s\n", "量りとる水量"); fprintf(stderr, "\tA, B: %s\n", "マス A, B の容量"); exit(1); } v = atoi(argv[1]); A = atoi(argv[2]); B = atoi(argv[3]); if ((A < 1) || (A > MAXC) || (B < 1) || (B > MAXC)) { fprintf(stderr, "A=%d, B=%d: %s%d%s\n", "マスの容量は 1 以上 ", MAXC, " 以下"); exit(2); } if ((v < 0) || ((v > A) && (v > B))) { fprintf(stderr, "v=%d: %s\n", v, "量りとる水量はマスの容量以下"); exit(3); } init(); n = breadth_first(&crock[0][0]); if (n == 0) { printf("*** %s ***\n", "解は存在しない"); exit(0); } // 以下、解を出力するための穴埋めを行う。 ... }