zoukankan      html  css  js  c++  java
  • hdu4528 小明系列故事——捉迷藏

    Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 1228    Accepted Submission(s): 322


    Problem Description
      小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。
      一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:
      只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被发现的人获胜,被找到的人下一轮负责找人;如果在规定的时间内一个人都没有找到,则小明失败了,下一轮还是他来找人。现在小明想知道,在规定时间内,自己是否可以找到所有的人,现在他想请你来帮忙计算一下。
      为了简单起见,把公园看成是n行m列的矩阵,其中’S’表示小明,’D’表示大名,’E’表示二明,’X’表示障碍物,’.’表示通路。这里,我们把发现定义为,可以直接看到对方, 也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方。并且假设,大明,二明藏好以后就不会再改变位置,小明每个单位时间可以从当前的位置走到相邻的四个位置之一,并且不会走出公园。
     

    Input
    测试数据第一行是一个正整数T,表示有T组测试数据。
    每一组测试数据首先是三个正整数n,m,t,分别表示行数、列数和规定的时间,接下来n行,每行m个上述的字符,并且保证有且只有一个’S’,一个’E’,一个’D’。

    [Technical Specification]
    T < 200
    3 <= n, m <= 100
    0 <= t <= 100
     

    Output
    每组先输出一行Case c:(c表示当前的组数,从1开始计数);
    接下来一行,如果小明可以在规定时间内找到所有的人,则输出最少需要的时间,否则输出-1。
     

    Sample Input
    3 5 6 3 XXD... ....E. ....X. ....S. ...... 5 6 3 XDX... ....E. ...... ....S. ...... 5 6 8 XXDX.. .XEX.. ...... ....S. ......
     

    Sample Output
    Case 1: -1 Case 2: 3 Case 3:

    -1

    这题用的是宽搜,其中有个地方要注意,一个位置走过,下次可能还可以走这个位置,但是要满足下次走的这个位置的状态和这次不同,可以用vis[i][j][num2][num3](num2<2 && num3<2)表示是不是经过这个位置且状态是(num2,num3),num2,num3分别代表(x2,y2),(x3,y3)是不是已经看到过。判断是否看到过,可以先预处理一下,用vis2[i][j]判断在(i,j)点是不是能看到(x2,y2),用vis3[i][j]判断在(i,j)点是不是能看到(x3,y3).

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define inf 99999999
    #define maxn 106
    char gra[maxn][maxn];
    int vis[maxn][maxn][2][2],vis2[maxn][maxn],vis3[maxn][maxn];
    int q[111111][5];
    int n,m,x1,y1,x2,y2,x3,y3,shijian,ans;
    int tab[6][2]={0,1,-1,0,0,-1,1,0};
    
    void init()
    {
        int i,j;
        memset(vis3,0,sizeof(vis3));
        memset(vis2,0,sizeof(vis2));
        for(i=x2-1;i>=1;i--){
            if(gra[i][y2]!='X'&& gra[i][y2]!='E'){
                vis2[i][y2]=1;
            }
            else break;
        }
        for(i=x2+1;i<=n;i++){
            if(gra[i][y2]!='X'&& gra[i][y2]!='E'){
                vis2[i][y2]=1;
            }
            else break;
        }
        for(j=y2-1;j>=1;j--){
            if(gra[x2][j]!='X' && gra[x2][j]!='E'){
                vis2[x2][j]=1;
            }
            else break;
        }
        for(j=y2+1;j<=m;j++){
            if(gra[x2][j]!='X'&& gra[x2][j]!='E'){
                vis2[x2][j]=1;
            }
            else break;
        }
    
    
    
    
        for(i=x3-1;i>=1;i--){
            if(gra[i][y3]!='X'&& gra[i][y3]!='D'){
                vis3[i][y3]=1;
            }
            else break;
        }
        for(i=x3+1;i<=n;i++){
            if(gra[i][y3]!='X'&& gra[i][y3]!='D'){
                vis3[i][y3]=1;
            }
            else break;
        }
        for(j=y3-1;j>=1;j--){
            if(gra[x3][j]!='X'&& gra[x3][j]!='D'){
                vis3[x3][j]=1;
            }
            else break;
        }
        for(j=y3+1;j<=m;j++){
            if(gra[x3][j]!='X'&& gra[x3][j]!='D'){
                vis3[x3][j]=1;
            }
            else break;
        }
    
    
    }
    
    
    void bfs()
    {
        int i,j,front,rear,num2,num3;
        int x,y,xx,yy,t,tt;
        front=rear=0;
        q[rear][0]=x1;q[rear][1]=y1;q[rear][2]=0;q[rear][3]=0;q[rear][4]=0;
        vis[x1][y1][0][0]=1;
        while(front<=rear){
            x=q[front][0];y=q[front][1];t=q[front][2];num2=q[front][3];num3=q[front][4];
            front++;
            if(vis2[x][y])num2=1;
            if(vis3[x][y])num3=1;
    
            if(num2==1 && num3==1){
                ans=t;break;
            }
            if(t>=shijian)continue;
            for(i=0;i<4;i++){
                xx=x+tab[i][0];
                yy=y+tab[i][1];
                if(xx>=1 && xx<=n && yy>=1 && yy<=m && !vis[xx][yy][num2][num3] && gra[xx][yy]!='X' && gra[xx][yy]!='D' && gra[xx][yy]!='E'){
                    vis[xx][yy][num2][num3]=1;
                    rear++;
                    q[rear][0]=xx;q[rear][1]=yy;q[rear][2]=t+1;q[rear][3]=num2;q[rear][4]=num3;
                }
            }
        }
    }
    
    int main()
    {
        int i,j,T,num1=0;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d",&n,&m,&shijian);
            memset(vis,0,sizeof(vis));
            for(i=1;i<=n;i++){
                scanf("%s",gra[i]+1);
                for(j=1;j<=m;j++){
                    if(gra[i][j]=='S'){
                        x1=i;y1=j;
                    }
                    else if(gra[i][j]=='D'){
                        x2=i;y2=j;
                    }
                    else if(gra[i][j]=='E'){
                        x3=i;y3=j;
                    }
                }
    
            }
            init();
            ans=inf;
            bfs();
            num1++;
            printf("Case %d:
    ",num1);
            if(ans==inf)printf("-1
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/herumw/p/9464655.html
Copyright © 2011-2022 走看看