zoukankan      html  css  js  c++  java
  • hdu 4528(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528

    思路:结构体里面不仅要记录x,y,time,还要有2个bool型来记录是否看到二明和大明,因此,对于状态判重,开个4位数组mark[x][y][tag1][tag2],因为根据看到的人不同,我这个点(x,y)还是可以 重复走的,最后就是关于怎么来判断看到的人了,这儿我用了最暴力的方法,就是一开始的时候记录二明和大明所在的位置,然后将其改为'X',因为这两个位置小明是不能走的。然后就是如果横坐标相同,就y方向上看能否看到(同理)。如果对于当前节点p有p.tag1=p.tag2=true,那么就要更新时间了。具体还是看代码吧。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<queue>
      5 using namespace std;
      6 #define MAXN 111
      7 #define inf 1<<30
      8 struct Node{
      9     int x,y;
     10     int time;
     11     bool tag1,tag2;
     12 };
     13 int n,m,time,ans;
     14 Node st,ed1,ed2;
     15 char map[MAXN][MAXN];
     16 bool mark[MAXN][MAXN][2][2];
     17 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
     18 
     19 bool Judge(Node &p){
     20     int x=p.x,y=p.y;
     21     if(x==ed1.x){
     22         for(int i=y+1;i<=m;i++){
     23             if(ed1.y==i){ p.tag1=true;break; }
     24             else if(map[x][i]=='X')break;
     25         }
     26         for(int i=y-1;i>=1;i--){
     27             if(ed1.y==i){ p.tag1=true;break; }
     28             else if(map[x][i]=='X')break;
     29         }
     30     }
     31     if(x==ed2.x){
     32         for(int i=y+1;i<=m;i++){
     33             if(ed2.y==i){ p.tag2=true;break; }
     34             else if(map[x][i]=='X')break;
     35         }
     36         for(int i=y-1;i>=1;i--){
     37             if(ed2.y==i){ p.tag2=true;break; }
     38             else if(map[x][i]=='X')break;
     39         }
     40     }
     41     if(y==ed1.y){
     42         for(int i=x+1;i<=n;i++){
     43             if(ed1.x==i){ p.tag1=true;break; }
     44             else if(map[i][y]=='X')break;
     45         }
     46         for(int i=x-1;i>=1;i--){
     47             if(ed1.x==i){ p.tag1=true;break; }
     48             else if(map[i][y]=='X')break;
     49         }
     50     }
     51     if(y==ed2.y){
     52         for(int i=x+1;i<=n;i++){
     53             if(ed2.x==i){ p.tag2=true;break; }
     54             else if(map[i][y]=='X')break;
     55         }
     56         for(int i=x-1;i>=1;i--){
     57             if(ed2.x==i){ p.tag2=true;break; }
     58             else if(map[i][y]=='X')break;
     59         }
     60     }
     61     if(p.tag1&&p.tag2)return true;
     62     return false;
     63 }
     64 
     65 
     66 void bfs(){
     67     memset(mark,false,sizeof(mark));
     68     queue<Node>Q;
     69     Node p,q;
     70     mark[st.x][st.y][st.tag1][st.tag2]=true;
     71     Q.push(st);
     72     while(!Q.empty()){
     73         p=Q.front();
     74         Q.pop();
     75         if(Judge(p))ans=min(ans,p.time);
     76         if(p.time>time)continue;
     77         for(int i=0;i<4;i++){
     78             q=p;
     79             q.x=p.x+dir[i][0];
     80             q.y=p.y+dir[i][1];
     81             if(q.x<1||q.x>n||q.y<1||q.y>m||map[q.x][q.y]=='X')
     82                 continue;
     83             if(!mark[q.x][q.y][q.tag1][q.tag2]){
     84                 mark[q.x][q.y][q.tag1][q.tag2]=true;
     85                 q.time++;
     86                 Q.push(q);
     87             }
     88         }
     89     }
     90 }
     91 
     92 int main(){
     93     int _case,t=1;
     94     scanf("%d",&_case);
     95     while(_case--){
     96         scanf("%d%d%d",&n,&m,&time);
     97         for(int i=1;i<=n;i++){
     98             scanf("%s",map[i]+1);
     99             for(int j=1;j<=m;j++){
    100                 if(map[i][j]=='S'){ 
    101                     map[i][j]=='.';
    102                     st.x=i,st.y=j,st.tag1=st.tag2=false,st.time=0; 
    103                 }else if(map[i][j]=='E'){
    104                     ed1.x=i,ed1.y=j;
    105                     map[i][j]='X';
    106                 }else if(map[i][j]=='D'){
    107                     map[i][j]='X';
    108                     ed2.x=i,ed2.y=j;
    109                 }
    110             }
    111         }
    112         ans=inf;
    113         bfs();
    114         printf("Case %d:\n",t++);
    115         if(ans<=time){
    116             printf("%d\n",ans);
    117         }else 
    118             puts("-1");
    119     }
    120     return 0;
    121 }
    View Code
  • 相关阅读:
    word设置的密码忘了怎么办?
    Navicat Report Viewer 设置 HTTP 的方法
    如何处理Navicat Report Viewer 报表
    excel密码忘记了怎么办
    Beyond Compare文本比较搜索功能详解
    Popular Cows POJ
    Problem B. Harvest of Apples HDU
    网络流模型整理
    The Shortest Statement CodeForces
    Vasya and Multisets CodeForces
  • 原文地址:https://www.cnblogs.com/wally/p/3093960.html
Copyright © 2011-2022 走看看