제출 #1338348

#제출 시각아이디문제언어결과실행 시간메모리
1338348onbertNavigation 2 (JOI21_navigation2)C++20
100 / 100
300 ms940 KiB
#include "Anna.h"
#include <bits/stdc++.h>
using namespace std;

namespace {

    const int maxn = 105;
    int n, k;
    vector<int> r, c;
    vector<int> winx[5] = {{},
        {-1, 0, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1}
    };
    vector<int> winy[5] = {{},
        {1, -1, 0, 1, -1, 0, 1},
        {0, 1, 0, 1, -1, 0, 1},
        {0, 1, -1, 1, -1, 0, 1},
        {-1, 1, 0, 1, -1, 0, 1}
    };
    
    int a[maxn][maxn], markx, marky;
    
    int pos(int x, int y) {
        return ((x - markx + 3) % 3) * 3 + ((y - marky + 3) % 3);
    }

} // namespace

void Anna(int N, int K, vector<int> R, vector<int> C) {
    n = N, r = R, c = C;
    for (int kk=1;kk<=4;kk++) for (int ii=0;ii<3;ii++) for (int jj=0;jj<3;jj++) {
        k = kk, markx = ii, marky = jj;
        bool ok = true;
        for (int i=0;i<n;i++) for (int j=0;j<n;j++) {
            int id = pos(i, j);
            if (id == 0) a[i][j] = 12;
            else if (id == 1) a[i][j] = k;
            else {
                id -= 2;
                if (abs(r[id] - i) <= 1 && abs(c[id] - j) <= 1) {
                    a[i][j] = -1;
                    for (int l=0;l<7;l++) {
                        int curx = i + winx[k][l], cury = j + winy[k][l];
                        if (curx == r[id] && cury == c[id]) {
                            a[i][j] = l + 5;
                            break;
                        }
                    }
                    if (a[i][j] == -1) ok = false;
                } else {
                    if (c[id] - 2 >= j) a[i][j] = 1;
                    else if (c[id] + 2 <= j) a[i][j] = 2;
                    else if (r[id] - 2 >= i) a[i][j] = 3;
                    else a[i][j] = 4;
                }
            }
        }
        if (ok) {
            for (int i=0;i<n;i++) for (int j=0;j<n;j++) SetFlag(i, j, a[i][j]);
            return;
        }
    }
}
#include "Bruno.h"
#include <bits/stdc++.h>
using namespace std;

namespace {

    struct tile {
        int val, x, y;
    };

    vector<int> winx[5] = {{},
        {-1, 0, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1},
        {-1, -1, 0, 0, 1, 1, 1}
    };
    vector<int> winy[5] = {{},
        {1, -1, 0, 1, -1, 0, 1},
        {0, 1, 0, 1, -1, 0, 1},
        {0, 1, -1, 1, -1, 0, 1},
        {-1, 1, 0, 1, -1, 0, 1}
    };

} // namespace

vector<int> Bruno(int K, vector<int> vec) {
    tile b[3][3];
    for (int i=0;i<9;i++) b[i/3][i%3] = {vec[i], i/3, i%3};
    while (b[0][0].val != 12 && b[0][1].val != 12 && b[0][2].val != 12) {
        for (int i=0;i<3;i++) swap(b[0][i], b[1][i]);
        for (int i=0;i<3;i++) swap(b[1][i], b[2][i]);
    }
    while (b[0][0].val != 12) {
        for (int i=0;i<3;i++) swap(b[i][0], b[i][1]);
        for (int i=0;i<3;i++) swap(b[i][1], b[i][2]);
    }
    int k = b[0][1].val;
    vector<int> ans(7);
    for (int i=0;i<7;i++) {
        tile cur = b[(i+2)/3][(i+2)%3];
        int val = cur.val;
        if (val <= 4) ans[i] = val - 1;
        else {
            int x = cur.x + winx[k][val - 5], y = cur.y + winy[k][val - 5];
            if (x == 1 && y == 1) ans[i] = 4;
            else if (y > 1) ans[i] = 0;
            else if (y < 1) ans[i] = 1;
            else if (x > 1) ans[i] = 2;
            else ans[i] = 3;
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...