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

 

posted @ 2013-05-22 23:28  ihge2k  阅读(237)  评论(0编辑  收藏  举报