제출 #1336347

#제출 시각아이디문제언어결과실행 시간메모리
1336347MisterReaperNavigation 2 (JOI21_navigation2)C++20
100 / 100
308 ms956 KiB
#include "Anna.h"
#include <bits/stdc++.h>

namespace {

} // namespace

void Anna(int N, int K, std::vector<int> R, std::vector<int> C) {
    bool det = false;
    std::vector<std::vector<int>> res(N, std::vector<int>(N, 0));
    for (int R0 = 0; R0 < 3; ++R0) {
        for (int C0 = 0; C0 < 3; ++C0) {
            bool good = true;
            std::vector<int> used(9);
            for (int i = 0; i < N; ++i) {
                for (int j = 0; j < N; ++j) {
                    int id = (i + R0) % 3 * 3 + (j + C0) % 3;
                    if (1 <= id && id <= 7) {
                        int x = R[id - 1] - i;
                        int y = C[id - 1] - j;
                        if (-1 <= x && x <= 1 && -1 <= y && y <= 1) {
                            used[3 * (x + 1) + (y + 1)] = true;
                        }
                    }
                }
            }
            if (!used[8]) {
                int emp = 0;
                while (used[emp]) {
                    emp += 1;
                }
                // std::cerr << emp << '\n';
                for (int i = 0; i < N; ++i) {
                    for (int j = 0; j < N; ++j) {
                        int id = (i + R0) % 3 * 3 + (j + C0) % 3;
                        if (id == 0) {
                            res[i][j] = 1;
                        } else if (id == 8) {
                            res[i][j] = 2 + emp;
                        } else {
                            int x = R[id - 1] - i;
                            int y = C[id - 1] - j;
                            if (-1 <= x && x <= 1 && -1 <= y && y <= 1) {
                                int u = (x + 1) * 3 + (y + 1);
                                assert(u != emp);
                                if (u > emp) {
                                    u -= 1;
                                }
                                res[i][j] = 2 + u;
                            } else {
                                if (x < -1) {
                                    res[i][j] = 9;
                                } else if (x > 1) {
                                    res[i][j] = 10;
                                } else if (y < -1) {
                                    res[i][j] = 11;
                                } else {
                                    res[i][j] = 12;
                                }
                            }
                        }
                    }
                }
                det = true;
                break;
            }
            if (det) {
                break;
            }
        }
        if (det) {
            break;
        }
    }
    assert(det);
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            SetFlag(i, j, res[i][j]);
            // std::cerr << res[i][j] << " \n"[j == N - 1];
        }
    }
}
#include "Bruno.h"
#include <bits/stdc++.h>

namespace {

} // namespace

std::vector<int> Bruno(int K, std::vector<int> value) {
    std::vector<int> res(K);
    std::vector<std::vector<int>> g(3, std::vector<int>(3));
    for (int i = 0; i < 9; ++i) {
        g[i / 3][i % 3] = value[i];
    }
    // for (int i = 0; i < 3; ++i) {
    //     for (int j = 0; j < 3; ++j) {
    //         std::cerr << g[i][j] << " \n"[j == 2];
    //     }
    // }
    int p = int(std::find(value.begin(), value.end(), 1) - value.begin());
    int R0 = (3 - p / 3) % 3;
    int C0 = (3 - p % 3) % 3;
    int emp = -1;
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            int id = (i + R0) % 3 * 3 + (j + C0) % 3;
            if (id == 8) {
                emp = g[i][j] - 2;
            } 
        }
    }
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            int id = (i + R0) % 3 * 3 + (j + C0) % 3;
            if (id == 0) {
                assert(g[i][j] == 1);
            } else if (id != 8) {
                id -= 1;
                if (g[i][j] >= 9) {
                    if (g[i][j] == 9) {
                        res[id] = 3;
                    } else if (g[i][j] == 10) {
                        res[id] = 2;
                    } else if (g[i][j] == 11) {
                        res[id] = 1;
                    } else {
                        res[id] = 0;
                    }
                } else {
                    int u = g[i][j] - 2;
                    if (u >= emp) {
                        u += 1;
                    }
                    int dx = i - 1;
                    int dy = j - 1;
                    dx += u / 3 - 1;
                    dy += u % 3 - 1;
                    if (dx <= -1) {
                        res[id] = 3;
                    } else if (dx >= 1) {
                        res[id] = 2;
                    } else if (dy <= -1) {
                        res[id] = 1;
                    } else if (dy >= 1) {
                        res[id] = 0;
                    } else {
                        res[id] = 4;
                    }
                }
            }
        }
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...