답안 #218030

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
218030 2020-03-31T12:49:15 Z SamAnd 로봇 (APIO13_robots) C++17
100 / 100
743 ms 143328 KB
#include <bits/stdc++.h>
using namespace std;
const int N = 503, K = 9, INF = 1000000009;
const int xx[4] = {-1, 0, 1, 0};
const int yy[4] = {0, 1, 0, -1};
struct ban
{
    int x, y;
    ban(){}
    ban(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
};

int n, m, k;
char a[N][N];
int sx[K], sy[K];

int c[N][N][4];
ban u[N][N][4];
void dfs(int x, int y, int z)
{
    c[x][y][z] = 1;
    int hx = x + xx[z];
    int hy = y + yy[z];
    int hz = z;
    if (!(hx >= 1 && hx <= n && hy >= 1 && hy <= m) || a[hx][hy] == 'x')
    {
        hx = x;
        hy = y;
    }
    else if (a[hx][hy] == 'C')
        hz = (z + 1) % 4;
    else if (a[hx][hy] == 'A')
        hz = (z - 1 + 4) % 4;
    if (hx == x && hy == y)
    {
        u[x][y][z] = ban(x, y);
        c[x][y][z] = 2;
        return;
    }
    if (!c[hx][hy][hz])
    {
        dfs(hx, hy, hz);
        u[x][y][z] = u[hx][hy][hz];
        c[x][y][z] = 2;
        return;
    }
    if (c[hx][hy][hz] == 2)
    {
        u[x][y][z] = u[hx][hy][hz];
        c[x][y][z] = 2;
        return;
    }
    u[x][y][z] = ban(-1, -1);
    c[x][y][z] = 2;
    return;
}

int z[K][K];
int dp[(K * (K + 1)) / 2][N][N];

bool cc[N][N];
vector<ban> q[N * N * K];

int main()
{
    //freopen("input.txt", "r", stdin);
    scanf("%d%d%d", &k, &m, &n);
    for (int i = 1; i <= n; ++i)
        scanf(" %s", (a[i] + 1));
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            if ('1' <= a[i][j] && a[i][j] <= '9')
            {
                sx[a[i][j] - '1'] = i;
                sy[a[i][j] - '1'] = j;
                a[i][j] = '.';
            }
        }
    }
    for (int i0 = 0; i0 < (K * (K + 1)) / 2; ++i0)
        for (int i2 = 0; i2 < N; ++i2)
            for (int i3 = 0; i3 < N; ++i3)
                dp[i0][i2][i3] = INF;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            for (int k = 0; k < 4; ++k)
            {
                if (!c[i][j][k])
                {
                    dfs(i, j, k);
                }
            }
        }
    }
    int zz = 0;
    for (int d = 1; d <= k; ++d)
    {
        for (int l = 0; l <= k - d; ++l)
        {
            int r = l + d - 1;
            z[l][r] = zz++;
        }
    }
    for (int d = 1; d <= k; ++d)
    {
        for (int l = 0; l <= k - d; ++l)
        {
            int r = l + d - 1;
            if (l == r)
                dp[z[l][r]][sx[l]][sy[l]] = 0;
            for (int i = 1; i <= n; ++i)
            {
                for (int j = 1; j <= m; ++j)
                {
                    for (int m = l; m < r; ++m)
                        dp[z[l][r]][i][j] = min(dp[z[l][r]][i][j], dp[z[l][m]][i][j] + dp[z[m + 1][r]][i][j]);
                }
            }
            memset(cc, false, sizeof cc);
            for (int i = 1; i <= n; ++i)
            {
                for (int j = 1; j <= m; ++j)
                {
                    if (dp[z[l][r]][i][j] != INF)
                        q[dp[z[l][r]][i][j]].push_back(ban(i, j));
                }
            }
            for (int ii = 0; ii < N * N * K; ++ii)
            {
                while (!q[ii].empty())
                {
                    ban t = q[ii].back();
                    q[ii].pop_back();
                    if (cc[t.x][t.y])
                        continue;
                    cc[t.x][t.y] = true;
                    for (int i = 0; i < 4; ++i)
                    {
                        ban h = u[t.x][t.y][i];
                        if (h.x == -1)
                            continue;
                        if (dp[z[l][r]][t.x][t.y] + 1 < dp[z[l][r]][h.x][h.y])
                        {
                            dp[z[l][r]][h.x][h.y] = dp[z[l][r]][t.x][t.y] + 1;
                            q[dp[z[l][r]][h.x][h.y]].push_back(h);
                        }
                    }
                }
            }
        }
    }
    int ans = INF;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            ans = min(ans, dp[z[0][k - 1]][i][j]);
        }
    }
    if (ans == INF)
        printf("-1\n");
    else
        printf("%d\n", ans);
    return 0;
}

Compilation message

robots.cpp: In function 'int main()':
robots.cpp:71:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d", &k, &m, &n);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
robots.cpp:73:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %s", (a[i] + 1));
         ~~~~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 98552 KB Output is correct
2 Correct 74 ms 98552 KB Output is correct
3 Correct 75 ms 98552 KB Output is correct
4 Correct 72 ms 98680 KB Output is correct
5 Correct 81 ms 98808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 98552 KB Output is correct
2 Correct 74 ms 98552 KB Output is correct
3 Correct 75 ms 98552 KB Output is correct
4 Correct 72 ms 98680 KB Output is correct
5 Correct 81 ms 98808 KB Output is correct
6 Correct 77 ms 98560 KB Output is correct
7 Correct 81 ms 98552 KB Output is correct
8 Correct 77 ms 98680 KB Output is correct
9 Correct 74 ms 98680 KB Output is correct
10 Correct 74 ms 98680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 98552 KB Output is correct
2 Correct 74 ms 98552 KB Output is correct
3 Correct 75 ms 98552 KB Output is correct
4 Correct 72 ms 98680 KB Output is correct
5 Correct 81 ms 98808 KB Output is correct
6 Correct 77 ms 98560 KB Output is correct
7 Correct 81 ms 98552 KB Output is correct
8 Correct 77 ms 98680 KB Output is correct
9 Correct 74 ms 98680 KB Output is correct
10 Correct 74 ms 98680 KB Output is correct
11 Correct 348 ms 109024 KB Output is correct
12 Correct 78 ms 105720 KB Output is correct
13 Correct 228 ms 105292 KB Output is correct
14 Correct 442 ms 114204 KB Output is correct
15 Correct 337 ms 106336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 98552 KB Output is correct
2 Correct 74 ms 98552 KB Output is correct
3 Correct 75 ms 98552 KB Output is correct
4 Correct 72 ms 98680 KB Output is correct
5 Correct 81 ms 98808 KB Output is correct
6 Correct 77 ms 98560 KB Output is correct
7 Correct 81 ms 98552 KB Output is correct
8 Correct 77 ms 98680 KB Output is correct
9 Correct 74 ms 98680 KB Output is correct
10 Correct 74 ms 98680 KB Output is correct
11 Correct 348 ms 109024 KB Output is correct
12 Correct 78 ms 105720 KB Output is correct
13 Correct 228 ms 105292 KB Output is correct
14 Correct 442 ms 114204 KB Output is correct
15 Correct 337 ms 106336 KB Output is correct
16 Correct 414 ms 111000 KB Output is correct
17 Correct 743 ms 143328 KB Output is correct
18 Correct 451 ms 115184 KB Output is correct
19 Correct 394 ms 111052 KB Output is correct
20 Correct 557 ms 125968 KB Output is correct