小白只会跟着题目做;
题目怎么描述,怎么写;
对于一个点可以走四个方向再加上传送,这个五种情况;

#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
int n,m,p,mp[maxn][maxn];
char mmp[maxn][maxn];
int door[maxn][maxn],vis[maxn*maxn];//door记录传送到的点,vis记录时间
int d[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
void bfs(int s,int t)
{
    queue<int> q;
    q.push(s);
    vis[s]=0;
    while(!q.empty())
    {
        int k=q.front();q.pop();
        int x=k/m,y=k%m;
        int f=door[x][y];
        if(f!=-1) {//判断该点是否可以传送
            if(vis[f]==-1) vis[f]=vis[k]+3,q.push(f);//如果还没走过f点,则放入
            else{
              if(vis[f]>vis[k]+3) vis[f]=vis[k]+3,q.push(f);//如果已经走过f点,f点的时间通过传送门更短,那么改变f点的时间,再次将f点放入,修改从f可以走到的点
            }
        }
        for(int i=0;i<4;i++)
        {
            int dx=x+d[i][1],dy=y+d[i][0];
            if(dx<0||dy<0||dx>=n||dy>=m||mp[dx][dy]) continue;
            int h=vis[x*m+y];
            if(vis[dx*m+dy]==-1) {//同上
                vis[dx*m+dy]=h+1;q.push(dx*m+dy);
            }
            else if(h+1>=vis[dx*m+dy]) continue;
            else{
                vis[dx*m+dy]=h+1;q.push(dx*m+dy);
            }
        }
    }
}
int main()
{
    while(scanf("%d %d %d ",&n,&m,&p)!=-1)
    {
        int s,t;
        memset(vis,-1,sizeof(vis));
        memset(door,-1,sizeof(door));
        memset(mp,0,sizeof(mp));
        memset(mmp,0,sizeof(mmp));
        for(int i=0;i<n;i++)
        {
            cin>>mmp[i];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(mmp[i][j]=='#') mp[i][j]=1;
                if(mmp[i][j]=='S') s=i*m+j;
                if(mmp[i][j]=='T') t=i*m+j;
            }
        }
        for(int i=1;i<=p;i++)
        {
            int x1,y1,x2,y2;
            cin>>x1>>y1>>x2>>y2;
            if(mp[x1][y1]||mp[x2][y2]) continue;//如果两点中有点出入陷阱位置,则不需记录
            door[x1][y1]=x2*m+y2;
        }
        bfs(s,t);
        printf("%d\n",vis[t]);
    }
}