#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |