hdu 4528(bfs)

来源:互联网 发布:python def的作用 编辑:程序博客网 时间:2024/05/29 14:30

题目链接: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

 

0 0
原创粉丝点击