Submission #1269521

#TimeUsernameProblemLanguageResultExecution timeMemory
1269521biank로봇 대회 (IOI23_robot)C++20
100 / 100
69 ms5892 KiB
#include "robot.h"
#include <bits/stdc++.h>

using namespace std;

#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)

using vi = vector<int>;

#define all(x) begin(x), end(x)

enum { NOTHING = -4, BOUNDARY, OBSTACLE, BLANK, PATH, WEST, SOUTH, EAST, NORTH };

const int POS = 0;

const string dir = "HWSEN";

pair<char, int> makeMove(int nxtDir) {
    return pair<char, int>{dir[nxtDir], nxtDir};
}

int rev(int d) { return (d + 1) % 4 + 1; }
int nxt(int d) { return d % 4 + 1; }

pair<char, int> getMove(vi state) {
    forn(i, 5) state[i]--;
    bool isStart = state[WEST] == BOUNDARY && state[NORTH] == BOUNDARY;
    bool isEnd = state[EAST] == BOUNDARY && state[SOUTH] == BOUNDARY;
    if (state[POS] == BLANK) {
        if (isStart) {
            if (state[SOUTH] == BLANK) return makeMove(SOUTH);
            if (state[EAST] == BLANK) return makeMove(EAST);
            return {'-', NOTHING};
        }
        if (isEnd) return {'H', EAST};
        forsn(nxtDir, 1, 5) if (state[nxtDir] == rev(nxtDir)) return makeMove(nxtDir);
        return {'-', NOTHING};
    }
    if (state[POS] <= PATH) return {'-', NOTHING};
    assert(WEST <= state[POS] && state[POS] <= NORTH);
    if (state[state[POS]] == rev(state[POS])) {
        int nxtDir = nxt(state[POS]);
        while (state[nxtDir] != BLANK && state[nxtDir] != rev(nxtDir)) nxtDir = nxt(nxtDir);
        return makeMove(nxtDir);
    }
    forsn(nxtDir, 1, 5) if (state[nxtDir] == rev(nxtDir)) return {dir[nxtDir], state[POS]};
    if (isStart || count(all(state), PATH) > 0) return {isEnd ? 'T' : dir[state[POS]], PATH};
    return {dir[state[POS]], BLANK};
}

void program_pulibot() {
    vi s(5);
    #define rep(i) for (s[i] = -2; s[i] <= 5; s[i]++)
    rep(0) rep(1) rep(2) rep(3) rep(4) {
        auto [A, Z] = getMove(s);
        if (Z != NOTHING) set_instruction(s, Z + 1, A);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...