// 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; }
// 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; }