meaning:
n * m的网格图上求S到T的最短距离 走一步耗费时间为1 传送门耗费的时间为3
solution:
容易想到bfs 但由于你传送过去所花费的时间不一定是最少的 所以不能用vis来标记 采用维护dist距离数组更新从S到各个点的最短距离 最终求出最短距离
tips:
1.判断当前点能不能走时 不能用mp[x][y] = '.' 原因是终点为'T' 这样会无法到达终点
2.这题有点卡空间(对于这种方法)注意只有当前距离更小时才使当前点入队 等于的时候不行 会多出太多重复情况导致MLE
#include <bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long #define mes(x, a) memset(x, a, sizeof(x)); #define sca(a) scanf("%d", &a) #define lowbit(x) x&(-x) #define mk make_pair #define pb(x) push_back(x) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define lson v << 1 #define rson v << 1 | 1 #define pii pair<int, int> const int N = 305; const int INF = 0x3f3f3f3f; struct node { int x, y; }; node s, en; int n, m; char mp[N][N]; int dist[N][N]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; vector<pair<int, int>> e[N][N]; void init() { memset(dist, 0x3f, sizeof(dist)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { e[i][j].clear(); } } } bool check(int x, int y) { if (x >= 0 && x < n && y >= 0 && y < m && mp[x][y] != '#') { return 1; } return 0; } queue<node> q; void bfs() { while (!q.empty()) q.pop(); q.push(s); dist[s.x][s.y] = 0; while (!q.empty()) { node now = q.front(); q.pop(); node next; for (int i = 0; i < 4; i++) { int xx = dx[i] + now.x; int yy = dy[i] + now.y; if (check(xx, yy) && dist[xx][yy] > dist[now.x][now.y] + 1) { next.x = xx, next.y = yy; dist[xx][yy] = dist[now.x][now.y] + 1; q.push(next); } } for (int i = 0; i < e[now.x][now.y].size(); i++) { int x = e[now.x][now.y][i].fi; int y = e[now.x][now.y][i].se; if (check(x,y) &&mp[x][y] != '#' && dist[x][y] > dist[now.x][now.y] + 3) { next.x = x, next.y = y; q.push(next); dist[x][y] = dist[now.x][now.y] + 3; } } } printf("%d\n", dist[en.x][en.y] == INF ? -1 : dist[en.x][en.y]); } int main() { int k; while (~scanf("%d%d%d", &n, &m, &k)) { init(); for (int i = 0; i < n; i++) { scanf("%s", mp[i]); } for (int i = 0; i < k; i++) { int x, y, a, b; scanf("%d%d%d%d", &x, &y, &a, &b); e[x][y].pb(make_pair(a, b)); } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] == 'S') { s.x = i; s.y = j; } if (mp[i][j] == 'T') { en.x = i; en.y = j; } } } bfs(); } return 0; }