제출 #847489

#제출 시각아이디문제언어결과실행 시간메모리
847489emeraldblock로봇 대회 (IOI23_robot)C++17
100 / 100
101 ms6268 KiB
#include "robot.h" #include <bits/stdc++.h> using namespace std; enum Id { Bound = -2, Block, Empty, Path, West, South, East, North, Imp, }; array<char,4> dirs{{'W','S','E','N'}}; pair<int,char> IMP = {Imp,'T'}; pair<int,char> move(array<int,5> S) { auto [h,w,s,e,n] = S; if (h == Empty) { if (w == Bound && n == Bound) { // start BFS phase if (s == Empty) { return {South,'S'}; } else { return {East,'E'}; } } else if (e == Bound && s == Bound) { // start pruning phase return {East,'H'}; } else { // extend tree for (int i = 0; i < 4; ++i) { if (S[i+1]-West == (i+2)%4) return {West+i,dirs[i]}; } return IMP; } } else if (0 <= h-West && h-West < 4) { int dir = h-West; if (S[dir+1]-West == (dir+2)%4) { // traverse tree int i = dir; do { i = (i+1)%4; if (S[i+1]-West == (i+2)%4 || S[i+1] == Empty) return {West+i,dirs[i]}; } while (i != dir); return IMP; } else { // pruning phase int i = dir; bool path = false; do { i = (i+1)%4; // traverse to tile other than previous if (S[i+1]-West == (i+2)%4) return {h,dirs[i]}; if (S[i+1] == Path) path = true; } while (i != dir); // prune return { path || (w == Bound && n == Bound) ? Path : Empty, e == Bound && s == Bound ? 'T' : dirs[i], }; } } else { return IMP; } } #define FR(x) for (int x = Bound; x < Imp; ++x) void program_pulibot() { FR(h) FR(w) FR(s) FR(e) FR(n) { auto [Z,A] = move({h,w,s,e,n}); set_instruction({h,w,s,e,n}, Z, 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...