#include <bits/stdc++.h>
using namespace std;

const int INF = 1 << 29;
int n, m, K;
int num[1005][1005];
bool vis[1005][6];
int dp[1005][1005][6];
vector<pair<int, int>> grp[1005];
const int dx[4] = {1, -1, 0, 0};
const int dy[4] = {0, 0, 1, -1};

int main() {
    scanf("%d %d %d", &n, &m, &K);
    int sx, sy, tx, ty;
    scanf("%d %d %d %d", &sx, &sy, &tx, &ty);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            scanf("%d", &num[i][j]);
            grp[num[i][j]].push_back({i, j});
        }

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            for (int t = 0; t <= K; t++) dp[i][j][t] = INF;
    dp[sx][sy][0] = 0;

    deque<array<int, 3>> dq;
    dq.push_back({sx, sy, 0});
    while (!dq.empty()) {
        array<int, 3> cur = dq.front();
        dq.pop_front();
        int x = cur[0], y = cur[1], t = cur[2], d = dp[x][y][t];
        int c = num[x][y];

        // 传送:编号 c 在第 t 层只需扩展一次(0-1 BFS 中首次弹出即为最小花费)
        if (t < K && !vis[c][t]) {
            vis[c][t] = true;
            for (auto &p : grp[c]) {
                int nx = p.first, ny = p.second;
                if (d < dp[nx][ny][t + 1]) {
                    dp[nx][ny][t + 1] = d;
                    dq.push_front({nx, ny, t + 1});
                }
            }
        }

        for (int dir = 0; dir < 4; dir++) {
            int nx = x + dx[dir], ny = y + dy[dir];
            if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
            if (d + 1 < dp[nx][ny][t]) {
                dp[nx][ny][t] = d + 1;
                dq.push_back({nx, ny, t});
            }
        }
    }

    int ans = INF;
    for (int t = 0; t <= K; t++) ans = min(ans, dp[tx][ty][t]);
    printf("%d\n", ans);
    return 0;
}

0 comments

No comments so far...

Information

ID
1849
Time
1000ms
Memory
256MiB
Difficulty
9
Tags
(None)
# Submissions
20
Accepted
3
Uploaded By