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

 

你可能感兴趣的:(HDU)