HDU4528+BFS

  1 /*
  2 bfs+标记状态
  3 如何记录状态是关键!!
  4 */
  5 #include<stdio.h>
  6 #include<string.h>
  7 #include<stdlib.h>
  8 #include<algorithm>
  9 #include<iostream>
 10 #include<queue>
 11 #include<stack>
 12 #include<math.h>
 13 #include<map>
 14 using namespace std;
 15 const int maxn = 115;
 16 const int inf = 9999999;
 17 char mat[ maxn ][ maxn ];
 18 int vis[ maxn ][ maxn ][ 2 ][ 2 ];
 19 const int dx[]={1,-1,0,0};
 20 const int dy[]={0,0,1,-1};
 21 struct Pos{
 22     int x,y;
 23 };
 24 struct Node{
 25     int x,y,ti;
 26     int D,E;//flag
 27 };
 28 Pos D,S,E;
 29 void init(){
 30     for( int i=0;i<maxn;i++ )
 31         for( int j=0;j<maxn;j++ )
 32             mat[i][j] = 'X';
 33 }
 34 
 35 bool in( Node p,int n,int m ){
 36     if( p.x>=0&&p.x<n&&p.y>=0&&p.y<m )
 37         return true;
 38     else
 39         return false;
 40 }
 41 bool Judge1( Node tmp ){
 42     int x = tmp.x;
 43     int y1 = min( tmp.y,D.y );
 44     int y2 = max( tmp.y,D.y );
 45     for( int i=y1+1;i<y2;i++ ){
 46         if( mat[x][i]=='X' ) return false;
 47         else if( mat[x][i]=='.' ){
 48             if( x==D.x&&i==D.y ) return false;
 49             else if( x==E.x&&i==E.y ) return false;
 50         }
 51     }
 52     return true;
 53 }
 54 bool Judge2( Node tmp ){
 55     int x = tmp.x;
 56     int y1 = min( tmp.y,E.y );
 57     int y2 = max( tmp.y,E.y );
 58     for( int i=y1+1;i<y2;i++ ){
 59         if( mat[x][i]=='X' ) return false;
 60         else if( mat[x][i]=='.' ){
 61             if( x==D.x&&i==D.y ) return false;
 62             else if( x==E.x&&i==E.y ) return false;
 63         }
 64     }
 65     return true;
 66 }
 67 bool Judge3( Node tmp ){
 68     int y = tmp.y;
 69     int x1 = min( tmp.x,D.x );
 70     int x2 = max( tmp.x,D.x );
 71     for( int i=x1+1;i<x2;i++ ){
 72         if( mat[i][y]=='X' ) return false;
 73         else if( mat[i][y]=='.' ){
 74             if( i==D.x&&y==D.y ) return false;
 75             else if( i==E.x&&y==E.y ) return false;
 76         }
 77     }
 78     return true;
 79 }
 80 bool Judge4( Node tmp ){
 81     int y = tmp.y;
 82     int x1 = min( tmp.x,E.x );
 83     int x2 = max( tmp.x,E.x );
 84     for( int i=x1+1;i<x2;i++ ){
 85         if( mat[i][y]=='X' ) return false;
 86         else if( mat[i][y]=='.' ){
 87             if( i==D.x&&y==D.y ) return false;
 88             else if( i==E.x&&y==E.y ) return false;
 89         }
 90     }
 91     return true;
 92 }
 93 
 94 int bfs( int n,int m,int aim_ti ){
 95     Node cur,nxt;
 96     cur.x = S.x;
 97     cur.y = S.y;
 98     cur.ti = 0;
 99     cur.D = cur.E = 0;
100     queue<Node>q;
101     while( !q.empty() )
102         q.pop();
103     q.push( cur );
104     int ans = inf;
105     vis[ cur.x ][ cur.y ][ cur.D ][ cur.E ] = 1;
106     while( !q.empty() ){
107         cur = q.front();
108         q.pop();
109         if( cur.ti>aim_ti ) continue;
110         //printf("cur:x=%d,y=%d,ti=%d\n",cur.x,cur.y,cur.ti);
111         if( cur.x==D.x&&Judge1( cur )==true ) cur.D = 1;
112         if( cur.x==E.x&&Judge2( cur )==true ) cur.E = 1;
113         if( cur.y==D.y&&Judge3( cur )==true ) cur.D = 1;
114         if( cur.y==E.y&&Judge4( cur )==true ) cur.E = 1;
115         if( cur.D==1 ) {
116             if( cur.E==1 ){
117                 if( ans>cur.ti ){
118                     ans = cur.ti;
119                 }
120             }
121         }
122             //printf("ans:%d\n",ans);
123         for( int i=0;i<4;i++ ){
124             nxt = cur;
125             nxt.x+=dx[i];
126             nxt.y+=dy[i];
127             nxt.ti++;
128             if( in( nxt,n,m )==true&&mat[nxt.x][nxt.y]!='X'&&vis[nxt.x][nxt.y][nxt.D][nxt.E]==0 ){
129                 vis[nxt.x][nxt.y][nxt.D][nxt.E] = 1;
130                 q.push(nxt);
131             }
132         }
133     }
134     if( ans>aim_ti ) return -1;
135     else return ans;
136 }
137 
138 int main(){
139     int ca,T;
140     scanf("%d",&ca);
141     T = 1;
142     while( ca-- ){
143         int n,m,aim_ti;
144         printf("Case %d:\n",T++);
145         init();
146         scanf("%d%d%d",&n,&m,&aim_ti);
147         for( int i=0;i<n;i++ ){
148             scanf("%s",mat[i]);
149             for( int j=0;j<m;j++ ){
150                 if( mat[i][j]=='D' ){
151                     D.x = i;
152                     D.y = j;
153                     mat[i][j]='X';
154                 }
155                 else if( mat[i][j]=='S' ){
156                     S.x = i;
157                     S.y = j;
158                     mat[i][j]='.';
159                 }
160                 else if( mat[i][j]=='E' ){
161                     E.x = i;
162                     E.y = j;
163                     mat[i][j]='X';
164                 }
165             }
166         }
167         memset( vis,0,sizeof( vis ) );
168         int ans = bfs( n,m,aim_ti );
169         printf("%d\n",ans);
170     }
171     return 0;
172 }
View Code

 

posted @ 2013-08-01 15:22  xxx0624  阅读(306)  评论(0编辑  收藏  举报