求助
查看原帖
求助
315205
Kniqht楼主2020/7/30 21:29

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=40;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int n,m,sx,sy,fx,fy,f[N][N][4],ans=1<<20;
char g[N][N];
bool check(int x,int y)
{
    if(x<1 || x>n || y<1 || y>m || g[x][y]=='.') return false;
    return true;
}
void dfs(int x,int y,int k,int dir)
{
    if(k>=f[x][y][dir]) return;
    f[x][y][dir]=k;
    if(x==fx && y==fy){ans=min(ans,k);return;}
    int x1=x,y1=y,leftx=x,lefty=y,rightx=x,righty=y,backx=x,backy=y;
    x1+=dx[dir],y1+=dy[dir];
    rightx+=dx[(dir+1)%4],righty+=dy[(dir+1)%4];
    backx+=dx[(dir+2)%4],backy+=dy[(dir+1)%4];
    leftx+=dx[(dir+3)%4],lefty+=dy[(dir+3)%4];
    if(check(x1,y1)) dfs(x1,y1,k,dir);
    if(check(leftx,lefty)) dfs(leftx,lefty,k+1,(dir+3)%4);
    if(check(rightx,righty)) dfs(rightx,righty,k+5,(dir+1)%4);
    if(!check(x1,y1) && !check(leftx,lefty) && !check(rightx,righty) && check(backx,backy)) dfs(backx,backy,k+10,(dir+2)%4);
}
int main()
{
    int dir;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf(" %c",&g[i][j]);
            if(g[i][j]=='E') sx=i,sy=j,dir=0;
            if(g[i][j]=='S') sx=i,sy=j,dir=1;
            if(g[i][j]=='W') sx=i,sy=j,dir=2;
            if(g[i][j]=='N') sx=i,sy=j,dir=3;
            if(g[i][j]=='F') fx=i,fy=j;
        }
    memset(f,0x3f,sizeof f);
    dfs(sx,sy,0,dir);
    printf("%d",ans);
    return 0;
}
2020/7/30 21:29
加载中...