이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "robot.h"
#include<bits/stdc++.h>
using namespace std;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
void guwno(vector<int>S) {
char D[]={'W', 'S', 'E', 'N'};
if(S[0]==1 || S[0]==9) {
rep(i, 4) if(S[i+1]==(i+2)%4+2) {
set_instruction(S, S[0], D[i]);
return;
}
if(S[1]==-2 && S[4]==-2) {
set_instruction(S, 1, 'T');
return;
}
}
if(S[0]==1) {
rep(i, 4) if(6<=S[i+1] && S[i+1]<=8) {
set_instruction(S, 1, D[i]);
return;
}
return;
}
if(S[0]==9) {
rep(i, 4) if(S[i+1]==9) {
set_instruction(S, 0, D[i]);
return;
}
if(S[1]==-2 && S[4]==1) {
set_instruction(S, 0, 'N');
return;
}
if(S[4]==-2 && S[1]==1) {
set_instruction(S, 0, 'W');
return;
}
set_instruction(S, 1, 'H');
return;
}
if(S[1]==-2 && S[4]==-2) {
// jestem w (0, 0)
// 6 oznaczalo ze szedlem w dol
// 7 oznaczalo ze szedlem w prawo
if(S[0]==0) {
// jestem na samym poczatku programu
if(S[2]!=0) {
set_instruction(S, 6, 'H');
return;
}
set_instruction(S, 6, 'S');
return;
}
rep(i, 4) if(S[i+1]==1) {
set_instruction(S, 1, 'H');
return;
}
if(S[0]==6) {
if(S[3]==0 || S[3]==2) {
set_instruction(S, 7, 'E');
return;
}
set_instruction(S, 7, 'H');
return;
}
if(S[0]==7) {
if(S[2]==0 || S[2]==5) {
set_instruction(S, 6, 'S');
return;
}
set_instruction(S, 6, 'H');
return;
}
return;
}
if(S[2]==-2 && S[3]==-2) {
// jestem w (H-1, W-1) i zaczynam wracac sciezka 6-8
if(6<=S[4] && S[4]<=8) {
set_instruction(S, 9, 'H');
return;
}
if(6<=S[1] && S[1]<=8) {
set_instruction(S, 9, 'H');
return;
}
return;
}
if(2<=S[0] && S[0]<=5) {
if(S[S[0]-1]==1 || S[S[0]-1]==9) {
set_instruction(S, 9, 'H');
return;
}
}
// patrze czy ktos kolo mnie ma juz 1 i sam tez sie ustawiam
rep(i, 4) if(S[i+1]==1) {
rep(j, 4) if(6<=S[j+1] && S[j+1]<=8) {
set_instruction(S, 9, 'H');
return;
}
return;
}
// jesli jestem 0 to znaczy ze musze zaznaczyc sobie strzalke i wrocic
// jesli jestem strzalka to znaczy ze musze zaznaczyc sie na 6 i isc w strone o 1 dalej niz strzalka
// jesli jestem 6 lub 7 to zaznaczam sie na kolejne i tez ide dalej wzgledem ostatniego
// jesli jestem 8 to zaznaczam sobie strzalke i wracam
if(S[0]==0) {
rep(i, 4) if(6<=S[i+1] && S[i+1]<=8) {
set_instruction(S, i+2, D[i]);
return;
}
return;
}
if(2<=S[0] && S[0]<=5) {
rep(i, 4) if(6<=S[i+1] && S[i+1]<=8) {
int p=(i+1)%4;
if(S[p+1]==0 || S[p+1]==(p+2)%4+2) {
set_instruction(S, 6, D[p]);
return;
}
set_instruction(S, 6, 'H');
return;
}
return;
}
if(S[0]==6 || S[0]==7) {
rep(i, 4) if(6<=S[i+1] && S[i+1]<=8) {
int p=(i+S[0]-4)%4;
if(S[p+1]==0 || S[p+1]==(p+2)%4+2) {
set_instruction(S, S[0]+1, D[p]);
return;
}
set_instruction(S, S[0]+1, 'H');
return;
}
return;
}
if(S[0]==8) {
rep(i, 4) if(6<=S[i+1] && S[i+1]<=8) {
set_instruction(S, i+2, D[i]);
return;
}
return;
}
}
void program_pulibot() {
int z=9;
rep(a, z+3) rep(b, z+3) rep(c, z+3) rep(d, z+3) rep(e, z+3) guwno({a-2, b-2, c-2, d-2, e-2});
}
// -2 - sciana
// -1 - blokada
// 0 - nie odwiedzony
// 1 - sciezka
// 2,3,4,5 - WSEN
// 6,7,8 - iteratory DFS
// optymalizacja na full:
// jesli jestem strzalka i pokazuje na 1 lub 9 to zmieniam sie w 9
// jesli jestem w 1 to patrze na boki czy nie ma strzalki patrzacej na mnie
# | 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... |