zoukankan      html  css  js  c++  java
  • HDU4528 小明捉迷藏 [搜索-BFS]

    一、题意

    小明S在迷宫n*m中找大明D和二明E,障碍物X不能走,问你计算是否能在时间t内找到大明和二明

    二、分析

    2.1与普通的BFS不同,这里可以走回头路,这里应该建立四维的标记数组标记数组,例如vis[1][0][nx][ny]表示已经找到D且没找到E且位置为(nx,ny)的状态,相同状态不可重复进入队列

    2.2根据样例二可知D,E的位置不可走,起始点S的位置等价于'.'

    2.3为了提高效率可预处理一下标记所有可以‘看到’D和E的点

    三、代码 

      1 # include <iostream>
      2 # include <cstdio>
      3 # include <queue>
      4 # include <cstring>
      5 using namespace std;
      6 const int maxn=105;
      7 int cnt,T,n,m,t,vis[2][2][maxn][maxn]; 
      8 int seeE[maxn][maxn],seeD[maxn][maxn];
      9 char map[maxn][maxn];
     10 int Dx,Dy,Ex,Ey,Sx,Sy;
     11 int dx[4]={-1,1,0,0};
     12 int dy[4]={0,0,1,-1};
     13 struct Node
     14 {
     15     int tim,x,y,e,d;
     16     Node(){}
     17     Node(int ee,int dd,int tt,int xx,int yy)
     18     {
     19         e=ee;
     20         d=dd;
     21         tim=tt;
     22         x=xx;
     23         y=yy;
     24     }
     25 };
     26 void Init()
     27 {
     28     scanf("%d%d%d",&n,&m,&t);
     29     for(int i=0;i<n;i++)
     30         scanf("%s",map[i]);
     31     //for(int i=0;i<n;i++)
     32     //    printf("%s
    ",map[i]); 
     33     memset(vis,0,sizeof(vis));
     34     memset(seeD,0,sizeof(seeD));
     35     memset(seeE,0,sizeof(seeE));
     36     for(int i=0;i<n;i++)
     37         for(int j=0;j<m;j++)
     38         {
     39             if(map[i][j]=='S')
     40             {
     41                 Sx=i;
     42                 Sy=j;
     43             }
     44             if(map[i][j]=='D')
     45             {
     46                 Dx=i;
     47                 Dy=j;
     48                 for(int i=Dx+1;i<n;i++)
     49                     if(map[i][Dy]=='.'||map[i][Dy]=='S')
     50                         seeD[i][Dy]=1;
     51                     else break;
     52                 for(int i=Dx-1;i>=0;i--)
     53                     if(map[i][Dy]=='.'||map[i][Dy]=='S')
     54                         seeD[i][Dy]=1;
     55                     else break;
     56                 for(int j=Dy+1;j<m;j++)
     57                     if(map[Dx][j]=='.'||map[Dx][j]=='S')
     58                         seeD[Dx][j]=1;
     59                     else break;
     60                 for(int j=Dy-1;j>=0;j--)
     61                     if(map[Dx][j]=='.'||map[Dx][j]=='S')
     62                         seeD[Dx][j]=1;
     63                     else break;
     64             }
     65             if(map[i][j]=='E')
     66             {
     67                 Ex=i;
     68                 Ey=j;
     69                 for(int i=Ex+1;i<n;i++)
     70                     if(map[i][Ey]=='.'||map[i][Ey]=='S')
     71                         seeE[i][Ey]=1;
     72                     else break;
     73                 for(int i=Ex-1;i>=0;i--)
     74                     if(map[i][Ey]=='.'||map[i][Ey]=='S')
     75                         seeE[i][Ey]=1;
     76                     else break;
     77                 for(int j=Ey+1;j<m;j++)
     78                     if(map[Ex][j]=='.'||map[Ex][j]=='S')
     79                         seeE[Ex][j]=1;
     80                     else break;
     81                 for(int j=Ey-1;j>=0;j--)
     82                     if(map[Ex][j]=='.'||map[Ex][j]=='S')
     83                         seeE[Ex][j]=1;
     84                     else break;
     85             }
     86         }
     87 }
     88 int Solve()
     89 {
     90     int res=-1;
     91     queue<Node> Q;
     92     map[Sx][Sy]='.'; 
     93     Q.push(Node(seeE[Sx][Sy],seeD[Sx][Sy],0,Sx,Sy));
     94     vis[seeE[Sx][Sy]][seeD[Sx][Sy]][Sx][Sy]=1;
     95     while(!Q.empty())
     96     {
     97         Node temp=Q.front();
     98         Q.pop();
     99         //printf("%d %d %d %d %d
    ",temp.e,temp.d,temp.x,temp.y,temp.tim);
    100         if(temp.tim>t) break;
    101         if(temp.e+temp.d==2)
    102         {
    103             res=temp.tim;
    104             break;
    105         }
    106         for(int i=0;i<4;i++)
    107         {
    108             int nx=temp.x+dx[i];
    109             int ny=temp.y+dy[i];
    110             //printf("%d %d
    ",nx,ny);
    111             if(nx>=0&&ny>=0&&nx<n&&ny<m&&map[nx][ny]=='.')
    112             {
    113                 int ne=seeE[nx][ny]?1:temp.e;
    114                 int nd=seeD[nx][ny]?1:temp.d;
    115                 //if(nx==3&&ny==3) {printf("test:%d
    ",vis[ne][nd][nx][ny]); break;}
    116                 if(!vis[ne][nd][nx][ny])
    117                 {    
    118                     vis[ne][nd][nx][ny]=1; 
    119                     Q.push(Node(ne,nd,temp.tim+1,nx,ny));
    120                 }
    121             }
    122         }
    123     }
    124     return res;        
    125 }
    126 int main()
    127 {
    128     scanf("%d",&T);
    129     for(int i=1;i<=T;i++)
    130     {
    131         Init();
    132         int ans=Solve();
    133         printf("Case %d:
    %d
    ",i,ans);
    134     }
    135     return 0;
    136 }
  • 相关阅读:
    (SPOJ4)Transform the Expression
    Minix2.0操作系统kernel文件分析
    Minix2.0内核源代码的组织结构
    powerdesigner教程系列(三)
    多线程
    软件架构师成长之路
    保护sqlconnection的链接字符串中的密码不泄露
    powerdesigner教程系列(四)
    [Serializable]在C#中的作用.NET 中的对象序列化
    vps经典文章
  • 原文地址:https://www.cnblogs.com/cnXuYang/p/8678250.html
Copyright © 2011-2022 走看看