예제 #1
0
// Determine if p is a valid proof. A proof is valid only when all
// goals have been dischared. An invalid proof is one where any
// goal is determined to be invalid. A proof is incomplete if any
// subgoaol is incomplete.
Validation
check_proof(Proof& p)
{
  Goal_list& goals = p.goals();
  auto iter = goals.begin();
  while (!goals.empty()) {
    Validation v = check_goal(p, *iter);
    if (v == valid_proof)
      iter = p.discharge(iter);
    else if (v == invalid_proof || v == incomplete_proof)
      return v;
    ++iter;
  }
  return valid_proof;
}
예제 #2
0
파일: agent.c 프로젝트: GGFT3/micromouse
// to_goalがtrueのとき、ゴールまでの経路を探索する
// to_goalがfalseのとき、未探索の地点までの経路を探索する
enum action_t agent_explore(void) {
    queueInit();
    for(int y = 0; y < size; ++y) {
        for(int x = 0; x < size; ++x) {
            if(check_goal(y, x)) {
                d[y][x] = 0;
                inQueue[y][x] = true;
                queueEnqueue(y, x);
            }
            else {
                d[y][x] = UCHAR_MAX - 1;
                inQueue[y][x] = false;
            }
        }
    }

    while(queueEmpty() == false) {
        int vy, vx;
        queueDequeue(&vy, &vx);
        inQueue[vy][vx] = false;

        for (int k = 0; k < 4; k++) {
            if (wall[vy][vx][k] == false) {
                int ny = vy + dy[k];
                int nx = vx + dx[k];
                if(d[ny][nx] > d[vy][vx] + 1) {
                    d[ny][nx] = d[vy][vx] + 1;
                    if(inQueue[ny][nx] == false) {
                        inQueue[ny][nx] = true;
                        queueEnqueue(ny, nx);
                    }
                }
            }
        }
    }

    if(wall[curY][curX][(dir + 0)%4] == false &&
            d[curY + dy[(dir + 0)%4]][curX + dx[(dir + 0)%4]] + 1 == d[curY][curX]) {
        // GoForward
        curY += dy[dir];
        curX += dx[dir];
        return GO_FORWARD;
    }

    if(wall[curY][curX][(dir + 1)%4] == false &&
            d[curY + dy[(dir + 1)%4]][curX + dx[(dir + 1)%4]] + 1 == d[curY][curX]) {
        // TurnLeft
        dir = (dir + 1) % 4;
        return TURN_LEFT;
    }

    if(wall[curY][curX][(dir + 3)%4] == false &&
            d[curY + dy[(dir + 3)%4]][curX + dx[(dir + 3)%4]] + 1 == d[curY][curX]) {
        // TurnRight
        dir = (dir + 3) % 4;
        return TURN_RIGHT;
    }

    if(wall[curY][curX][(dir + 2)%4] == false &&
            d[curY + dy[(dir + 2)%4]][curX + dx[(dir + 2)%4]] + 1 == d[curY][curX]) {
        // TurnLeft
        dir = (dir + 1) % 4;
        return TURN_LEFT;
    }

    return NO_OPERATION;
}