maze题解
maze
https://ac.nowcoder.com/acm/problem/15665?&headNav=acm
我看很多大佬都是最短路做的 ,然后我最短路学的不好 ,然后偶然间看到一个大佬和我一样想法,首先直接BFS,但是这个bfs要开一个dis数组,代表该点的最短距离是多少,然后每次去更新,分别去入队每次正常走和进入传送门的,然后每次更新。
#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define debug(x) cout << #x << ": " << x << endl;
#define debug1(x) cout<<"xxx"<<endl;
#define ll long long
#define ull unsigned long long
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#define mse(a,b) memset(a,b,sizeof a);
using namespace std;
const int maxx=1e6+100;
const int mod=1e9+7;
char cmp[350][350];
pair<int,int>pii;
int a,b,c,d;
int n,m,q;
struct node{
int x,y;
};
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
vector<pair<int,int> >ans[350][350];
int dis[350][350];
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
ans[i][j].clear();
}
int check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&cmp[x][y]!='#')
return 1;
return 0;
}
void bfs(int a,int b)
{
queue<node>qq;
node s;
s=node{a,b};
dis[a][b]=0;
qq.push(s);
while(!qq.empty())
{
node p=qq.front();
qq.pop();
for(int i=0;i<4;i++)
{
int xx=p.x+dx[i];
int yy=p.y+dy[i];
if(check(xx,yy)&&dis[xx][yy]>dis[p.x][p.y]+1)
{
dis[xx][yy]=dis[p.x][p.y]+1;
qq.push(node{xx,yy});
}
}
for(int i=0;i<ans[p.x][p.y].size();i++)
{
int xx=ans[p.x][p.y][i].first;
int yy=ans[p.x][p.y][i].second;
if(check(xx,yy)&&dis[xx][yy]>dis[p.x][p.y]+3)
{
dis[xx][yy]=dis[p.x][p.y]+3;
qq.push(node{xx,yy});
}
}
}
if(dis[c][d]!=0x3f3f3f)
cout<<dis[c][d]<<endl;
else
cout<<-1<<endl;
}
int main()
{
fio;
while(~scanf("%d%d%d",&n,&m,&q)){
init();
for(int i=0;i<n;i++)
{
scanf("%s",cmp[i]);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
dis[i][j]=0x3f3f3f;
if(cmp[i][j]=='S')
{
a=i,b=j;
}
if(cmp[i][j]=='T')
c=i,d=j;
}
for(int i=1;i<=q;i++)
{
int x,y,xx,yy;
scanf("%d%d%d%d",&x,&y,&xx,&yy);
ans[x][y].push_back(make_pair(xx,yy));
}
bfs(a,b);
}
return 0;
}
查看13道真题和解析