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
  • 相关阅读:
    Effective C++读书笔记~4 设计与声明
    《程序员的自我修养》读书笔记 第十一章 运行库
    C++ 调试问题:对象包含与成员函数不兼容的类型限定符
    Effective C++读书笔记~6 继承与面向对象设计
    C++ lambda表达式
    备战前端
    SQL Server2008 统计某个数据库用户表和行计数方法
    回想
    C# 理解lock
    (原创)Nhibernate对象关系映射的两种方式以及一些注意
  • 原文地址:https://www.cnblogs.com/wally/p/3093960.html
Copyright © 2011-2022 走看看