#include "robot.h"
#include <array>
#include <set>
std::set<std::array<int, 5>> asked;
void my_set_instruction(std::array<int, 5> ask, int Z, char A) {
    if (asked.count(ask)) return;
    set_instruction({ask[0], ask[1], ask[2], ask[3], ask[4]}, Z, A);
    asked.insert(ask);
}
void program_pulibot()
{
    // dfs 0 not jet visited, 2 visited, 3 way back
    std::vector<int> r1 = {-2, -1, 0, 2, 3};
    // North outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({0, r1[i], r1[j], r1[k], 0}, 2, 'N');
            }
        }
    }
    // East outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({0, r1[i], r1[j], 0, r1[k]}, 2, 'E');
            }
        }
    }
    // South outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({0, r1[i], 0, r1[j], r1[k]}, 2, 'S');
            }
        }
    }
    // West outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({0, 0, r1[i], r1[j], r1[k]}, 2, 'W');
            }
        }
    }
    // Terminate
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            my_set_instruction({2, r1[i], -2, -2, r1[j]}, 2, 'T');
        }
    }
    // Stay outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                for (int l = 0; l < r1.size(); l++) {
                    my_set_instruction({0, r1[i], r1[j], r1[k], r1[l]}, 2, 'H');
                }
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    // North outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], r1[j], r1[k], 0}, 2, 'N');
            }
        }
    }
    // East outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], r1[j], 0, r1[k]}, 2, 'E');
            }
        }
    }
    // South outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], 0, r1[j], r1[k]}, 2, 'S');
            }
        }
    }
    // West outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, 0, r1[i], r1[j], r1[k]}, 2, 'W');
            }
        }
    }
    // North outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], r1[j], r1[k], 2}, 3, 'N');
            }
        }
    }
    // East outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], r1[j], 2, r1[k]}, 3, 'E');
            }
        }
    }
    // South outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, r1[i], 2, r1[j], r1[k]}, 3, 'S');
            }
        }
    }
    // West outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                my_set_instruction({2, 2, r1[i], r1[j], r1[k]}, 3, 'W');
            }
        }
    }
    // Stay outbound
    for (int i = 0; i < r1.size(); i++) {
        for (int j = 0; j < r1.size(); j++) {
            for (int k = 0; k < r1.size(); k++) {
                for (int l = 0; l < r1.size(); l++) {
                    my_set_instruction({2, r1[i], r1[j], r1[k], r1[l]}, 3, 'T');
                }
            }
        }
    }
}
| # | 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... |