0分WA+TLE
查看原帖
0分WA+TLE
633466
LiaoYF1楼主2022/12/24 18:27
#include<iostream>
#include<cstring>
using namespace std;
int h,w,dis[35][35][4],sx,sy,ex,ey;
char a[35][35];
const int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0},turnl[4]={2,3,1,0},turnr[4]={3,2,0,1},turnd[4]={1,0,3,2};
bool ok(int x,int y){
    return x>=1&&x<=h&&y>=1&&y<=w&&a[x][y]!='.';
}
void dfs(int x,int y,int fx,int sum){
    //cout<<1;
    //cout<<x<<" "<<y<<" "<<fx<<"\n";
    //cout<<dis[x][y][fx]<<"\n";
    if(sum>dis[x][y][fx])return;
    dis[x][y][fx]=sum;
    //cout<<x<<" "<<y<<" "<<fx<<" "<<dis[x][y][fx]<<"\n";
    if(ok(x+dx[fx],y+dy[fx])){
        dfs(x+dx[fx],y+dy[fx],fx,sum);
    }
    bool flag=0;
    if(ok(x+dx[turnl[fx]],y+dy[turnl[fx]])){
        dfs(x+dx[turnl[fx]],y+dy[turnl[fx]],turnl[fx],sum+1);
        flag=1;
    }
    //cout<<x+dx[turnr[fx]]<<" "<<y+dy[turnr[fx]]<<"\n";
    //cout<<ok(x+dx[turnr[fx]],y+dy[turnr[fx]])<<"\n";
    if(ok(x+dx[turnr[fx]],y+dy[turnr[fx]])){
        //cout<<1;
        dfs(x+dx[turnr[fx]],y+dy[turnr[fx]],turnr[fx],sum+5);
        flag=1;
    }
    if(flag==0&&ok(x+dx[turnd[fx]],y+dy[turnd[fx]])!='#'){
        dfs(x+dx[turnd[fx]],y+dy[turnd[fx]],turnd[fx],sum+10);
    }
}
int main(){
    cin>>h>>w;
    char fx;
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cin>>a[i][j];
            if(a[i][j]=='E')fx=0,sx=i,sy=j;
            if(a[i][j]=='W')fx=1,sx=i,sy=j;
            if(a[i][j]=='N')fx=2,sx=i,sy=j;
            if(a[i][j]=='S')fx=3,sx=i,sy=j;
            if(a[i][j]=='F')ex=i,ey=j;
        }
    }
    memset(dis,0x3f,sizeof(dis));
    dfs(sx,sy,fx,0);
    int ans=0x3f3f3f3f;
    for(int i=0;i<4;i++){
        ans=min(ans,dis[h][w][i]);
    }
    cout<<ans;
    return 0;
}
2022/12/24 18:27
加载中...