HDU1180+BFS

bfs
思路:三维标记状态 && 处理好 - | 和时刻的关系即可

  1 /*

  2 bfs

  3 思路:三维标记状态 && 处理好 - | 和时刻的关系即可

  4 */

  5 #include<algorithm>  

  6 #include<iostream>  

  7 #include<string.h>  

  8 #include<stdlib.h>  

  9 #include<stdio.h>  

 10 #include<math.h>  

 11 #include<queue>  

 12 #include<stack>  

 13 #include<map>  

 14 #include<set>  

 15 using namespace std;  

 16 typedef long long int64;  

 17 //typedef __int64 int64;  

 18 typedef pair<int64,int64> PII;  

 19 #define MP(a,b) make_pair((a),(b))   

 20 const int inf = 0x3f3f3f3f;  

 21 const double pi=acos(-1.0);  

 22 const int dx[]={1,-1,0,0};  

 23 const int dy[]={0,0,1,-1};  

 24 const double eps = 1e-8;  

 25 const int maxm = 1005;  

 26 const int maxn = 25;  

 27 

 28 struct Point {

 29     int x,y,t;

 30 };

 31 Point s,e;

 32 

 33 bool vis[ maxn ][ maxn ][ 2 ];

 34 char mat[ maxn ][ maxn ];

 35 queue<Point>q;

 36 

 37 int bfs( int n,int m ){

 38     memset( vis,false,sizeof( vis ) );

 39     while( !q.empty() )

 40         q.pop();

 41     Point cur = s;

 42     vis[ s.x ][ s.y ][ s.t%2 ] = true;

 43     q.push( cur );

 44     while( !q.empty() ){

 45         cur = q.front();

 46         q.pop();

 47         //printf("\ncur:[%d,%d] t = %d\n",cur.x,cur.y,cur.t);

 48         if( cur.x==e.x && cur.y==e.y ){

 49             e.t = min( e.t,cur.t );

 50         }

 51         if( cur.t>=e.t ) continue;

 52         for( int i=0;i<4;i++ ){

 53             Point nxt;

 54             nxt.x = cur.x + dx[ i ];

 55             nxt.y = cur.y + dy[ i ];

 56             nxt.t = cur.t + 1;

 57             if( nxt.x<0||nxt.x>=n||nxt.y<0||nxt.y>=m ) continue;

 58             if( mat[ nxt.x ][ nxt.y ]=='*' ) continue;

 59             if( mat[ nxt.x ][ nxt.y ]=='.' ){

 60                 if( vis[ nxt.x ][ nxt.y ][ nxt.t%2 ]==true ) continue;

 61                 vis[ nxt.x ][ nxt.y ][ nxt.t%2 ] = true;

 62                 q.push( nxt );

 63                 //printf("0 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);

 64                 continue;

 65             }//

 66             nxt.x = cur.x + dx[ i ];

 67             nxt.y = cur.y + dy[ i ];

 68             nxt.t = cur.t + 1;

 69             if(( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%2==0 )||( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%2==1 )){

 70                 if( cur.x==nxt.x&&nxt.y>cur.y ) nxt.y = cur.y + 2;

 71                 if( cur.x==nxt.x&&nxt.y<cur.y ) nxt.y = cur.y - 2;

 72                 if( nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){

 73                     if( vis[ nxt.x ][ nxt.y ][ nxt.t%2 ]==false ){

 74                         vis[ nxt.x ][ nxt.y ][ nxt.t%2 ] = true;

 75                         q.push( nxt );

 76                         //printf("1 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);

 77                         continue;

 78                     }

 79                 }

 80             }//1 ‘-’ 上下无需等待时间

 81             nxt.x = cur.x + dx[ i ];

 82             nxt.y = cur.y + dy[ i ];

 83             nxt.t = cur.t + 1;

 84             /*恢复nxt很重要*/

 85             if(( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%2==1 )||( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%2==0 )){

 86                 nxt.t = cur.t + 2;

 87                 if( cur.x==nxt.x&&nxt.y>cur.y ) nxt.y = cur.y + 2;

 88                 if( cur.x==nxt.x&&nxt.y<cur.y ) nxt.y = cur.y - 2;

 89                 if( nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){

 90                     if( vis[ nxt.x ][ nxt.y ][ nxt.t%2 ]==false ){

 91                         vis[ nxt.x ][ nxt.y ][ nxt.t%2 ] = true;

 92                         q.push( nxt );

 93                         //printf("2 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);

 94                         continue;

 95                     }

 96                 }

 97             }//2 ‘-’ 上下需要等待时间

 98             nxt.x = cur.x + dx[ i ];

 99             nxt.y = cur.y + dy[ i ];

100             nxt.t = cur.t + 1;

101             /*恢复nxt很重要*/

102             if(( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%2==0 )||( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%2==1 )){

103                 if( cur.y==nxt.y&&nxt.x>cur.x ) nxt.x = cur.x + 2;

104                 if( cur.y==nxt.y&&nxt.x<cur.x ) nxt.x = cur.x - 2;

105                 if( nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){

106                     if( vis[ nxt.x ][ nxt.y ][ nxt.t%2 ]==false ){

107                         vis[ nxt.x ][ nxt.y ][ nxt.t%2 ] = true;

108                         q.push( nxt );

109                         //printf("3 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);

110                         continue;

111                     }

112                 }

113             }//3 ‘|’ 左右无需等待时间

114             nxt.x = cur.x + dx[ i ];

115             nxt.y = cur.y + dy[ i ];

116             nxt.t = cur.t + 1;

117             /*恢复nxt很重要*/

118             if(( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%2==1 )||( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%2==0 )){

119                 nxt.t = cur.t + 2;

120                 if( cur.y==nxt.y&&nxt.x>cur.x ) nxt.x = cur.x + 2;

121                 if( cur.y==nxt.y&&nxt.x<cur.x ) nxt.x = cur.x - 2;

122                 if( nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){

123                     if( vis[ nxt.x ][ nxt.y ][ nxt.t%2 ]==false ){

124                         vis[ nxt.x ][ nxt.y ][ nxt.t%2 ] = true;

125                         q.push( nxt );

126                         //printf("4 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);

127                         continue;

128                     }

129                 }

130             }//4 ‘|’ 左右需要等待时间

131         }

132     }

133     return e.t;

134 }

135      

136 int main(){

137     int n,m;

138     //freopen( "in.txt","r",stdin );

139     while( scanf("%d%d",&n,&m)==2 ){

140         for( int i=0;i<n;i++ ){

141             scanf("%s",mat[ i ]);

142             for( int j=0;j<m;j++ ){

143                 if( mat[ i ][ j ]=='S' ){

144                     s.x = i;

145                     s.y = j;

146                     s.t = 0;

147                     mat[ i ][ j ] = '.';

148                 }

149                 else if( mat[ i ][ j ]=='T' ){

150                     e.x = i;

151                     e.y = j;

152                     e.t = inf;

153                     mat[ i ][ j ] = '.';

154                 }

155             }

156         }

157         printf("%d\n",bfs( n,m ));

158     }

159     return 0;

160 }
View Code

 

你可能感兴趣的:(HDU)