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;
}