- 最短航线
标程还有30%TE
- @ 2026-10-25 20:37:44
#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;
}
1 comments
-
老猫不掉毛 LV 10 @ 2026-10-25 20:41:09啊呀我咋发了两遍
🤣 1
- 1
Information
- ID
- 1849
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- (None)
- # Submissions
- 20
- Accepted
- 3
- Uploaded By