qwq
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50;
int n,m,ans,mp[maxn][maxn],xx,yy,x,y,to;
ll dist[maxn][maxn][5];
const int dx[]= {0,0,1,-1},dy[]= {1,-1,0,0};
struct node {
int x,y,to;
};
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline int bfs(int x,int y,int to) {
memset(dist,0x7f7f7f,sizeof dist);
priority_queue<node> pq;
dist[x][y][to]=0;
pq.push(node {x,y,to});
while(!pq.empty()) {
bool pd=0;
node u=pq.top();
pq.pop();
if(u.x==xx&&u.y==yy) break;
int nx=u.x+dx[u.to],ny=u.y+dy[u.to];
if(mp[nx][ny]!=1) pd=1;
if(mp[nx][ny]&&dist[nx][ny][u.to]>dist[u.x][u.y][u.to]) {
dist[nx][ny][u.to]=dist[u.x][u.y][u.to];
pq.push(node {nx,ny,u.to});
}
nx=u.x+dx[(u.to+3)%4],ny=u.y+dy[(u.to+3)%4];
if(mp[nx][ny]!=1) pd=1;
if(mp[nx][ny]&&dist[nx][ny][(u.to+3)%4]>dist[u.x][u.y][u.to]+1) {
dist[nx][ny][(u.to+3)%4]=dist[u.x][u.y][u.to];
pq.push(node {nx,ny,(u.to+3)%4});
}
nx=u.x+dx[(u.to+1)%4],ny=u.y+dy[(u.to+1)%4];
if(mp[nx][ny]!=1) pd=1;
if(mp[nx][ny]&&dist[nx][ny][(u.to+1)%4]>dist[u.x][u.y][u.to]+5) {
dist[nx][ny][(u.to+1)%4]=dist[u.x][u.y][u.to];
pq.push(node {nx,ny,(u.to+1)%4});
}
if(!pd) {
nx=u.x+dx[(u.to+2)%4],ny=u.y+dy[(u.to+2)%4];
if(mp[nx][ny]&&dist[nx][ny][(u.to+2)%4]>dist[u.x][u.y][u.to]+10) {
dist[nx][ny][(u.to+2)%4]=dist[u.x][u.y][u.to];
pq.push(node {nx,ny,(u.to+2)%4});
}
}
}
}
signed main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j) {
char ch;
cin>>ch;
if(ch=='.') mp[i][j]=0;
else if(ch=='#') mp[i][j]=1;
else if(ch=='F') mp[i][j]=3,xx=i,yy=j;
else {
mp[i][j]=2,x=i,y=j;
if(ch=='E') to=1;
else if(ch=='W') to=2;
else if(ch=='N') to=4;
else if(ch=='S') to=3;
}
}
bfs(x,y,to);
printf("%lld\n",dist[x][y][to]);
return 0;
}