2024乔斯复赛集训九连测-(第八场)

正在进行… IOI 开始于: 2024-10-21 19:00 20000 小时 主持人: 182

2024乔斯复赛集训九连测-(第八场)

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

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
const int N = 1e3 + 5;

struct Node { int x, y, t; };       //t记录穿过虫洞的次数

int n, m, k, sx, sy, x2, y2;
vector<Node> G[N];

int g[N][N], dis[N][N][6]; //dis i, j, k表示从起点到达(i, j),经过k次虫洞的最少耗费电量
int vis[N][6];   //是否在第j轮穿过虫洞的时候,穿过了该颜色为i的虫洞,需要多加一维,因为到达某个编号的虫洞,剩余的虫洞使用次数不同,也会对应不同的情况

void spfa() {
  queue<Node> q;
  memset(dis, 127, sizeof dis);     //初始化为无穷大
  dis[sx][sy][0] = 0; 
  q.push({sx, sy, 0});
  while(q.size()) {
    Node u = q.front(); q.pop();
    
    //走虫洞的走法
    if(u.t < k && !vis[g[u.x][u.y]][u.t]) {
      for (auto p : G[g[u.x][u.y]]) {
        if(dis[p.x][p.y][u.t + 1] > dis[u.x][u.y][u.t]) {
          dis[p.x][p.y][u.t + 1] = dis[u.x][u.y][u.t];
          q.push({p.x, p.y, u.t + 1});
        }
      }
      vis[g[u.x][u.y]][u.t] = 1;
    }
    //走周围的走法
    for (int i = 0; i < 4; i++) {
      int nx = u.x + dx[i], ny = u.y + dy[i];
      if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
      if(dis[nx][ny][u.t] > dis[u.x][u.y][u.t] + 1) {
        dis[nx][ny][u.t] = dis[u.x][u.y][u.t] + 1;
        q.push({nx, ny, u.t});
      }
    }
  }
}
int main() {
  freopen("hole.in", "r", stdin);
  freopen("hole.out", "w", stdout);
  cin >> n >> m >> k >> sx >> sy >> x2 >> y2;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> g[i][j];
      G[g[i][j]].push_back({i, j});
    }
  }
  spfa();
  int ans = INT_MAX;
  for (int i = 0; i <= k; i++) ans = min(ans, dis[x2][y2][i]);
  cout << ans;
  return 0;
}

我们会在赛后检查代码相似度。

状态
正在进行…
规则
IOI
题目
4
开始于
2024-10-21 19:00
结束于
2027-2-2 3:00
持续时间
20000 小时
主持人
参赛人数
182