hdu4528

链接:hdu4528

题解

  • bfs好题,简单但是有点烦,注意E,D要当成墙2333.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define rep(i,x,y) for(register int i=x;i<=y;++i)
    #define repd(i,x,y) for(register int i=x;i>=y;--i)
    #define ll long long
    using namespace std;
    const int N=1e2+7;
    typedef pair<int,int> s;
    struct node{
    int x,y,dis,cnt;
    inline void init(int a,int b,int c,int d){x=a;y=b;dis=c;cnt=d;}
    }a;
    s A,B,S;
    queue<node> q;
    char str[N];
    int map[N][N],vis[4][N][N],n,m,t,T;
    int dx[]={0,-1,1,0,0};
    int dy[]={0,0,0,-1,1};
    inline int judge(int x,int y){return x<1||x>n||y<1||y>m||map[x][y]==4;}
    inline void init(){
    memset(vis,0,sizeof vis);
    while(!q.empty())q.pop();
    rep(i,1,n){
    scanf("%s",str+1);
    rep(j,1,m){
    map[i][j]=(str[j]!='.'&&str[j]!='S')?4:0;
    if(str[j]=='S')S=s(i,j);
    else if(str[j]=='E')A=s(i,j);
    else if(str[j]=='D')B=s(i,j);
    }
    }
    rep(k,1,2){
    int x,y;
    if(k==1)x=A.first,y=A.second;
    else x=B.first,y=B.second;
    rep(j,1,4)rep(l,1,j<3?n:m){
    int nx=x+dx[j]*l,ny=y+dy[j]*l;
    if(judge(nx,ny))break;
    map[nx][ny]+=k;
    }
    }
    }
    int main(){
    scanf("%d",&T);
    rep(cse,1,T){
    scanf("%d%d%d",&n,&m,&t);
    init();
    int res=0,ans=-1;
    a.init(S.first,S.second,0,map[S.first][S.second]);
    if(a.cnt==4)a.cnt=0;
    q.push(a);vis[a.cnt][S.first][S.second];
    while(!q.empty()){
    int x=q.front().x,y=q.front().y,dis=q.front().dis,cnt=q.front().cnt;
    q.pop();
    if(cnt==3){ans=dis;break;}
    rep(i,1,4){
    int nx=x+dx[i],ny=y+dy[i];
    if(judge(nx,ny)||dis+1>t)continue;
    int ncnt=cnt+((map[nx][ny]!=cnt)?map[nx][ny]:0);
    if(ncnt>3)ncnt=3;
    if(vis[ncnt][nx][ny])continue;
    a.init(nx,ny,dis+1,ncnt);
    vis[ncnt][nx][ny]=1;
    q.push(a);
    }
    }
    printf("Case %d:\n%d\n",cse,ans);
    }
    return 0;
    }