• 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
    ",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
    ",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:
    ",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
    ",ans);
    170     }
    171     return 0;
    172 }
    View Code
    keep moving...
  • 相关阅读:
    CF # 296 C Glass Carving (并查集 或者 multiset)
    linux 基本命令
    为什么是丰田——丰田的七个习惯之习惯一
    关注C-RAN 的五大理由
    一个效果非常华丽的仿桌面APP,却胜似Launcher
    IOS6.0自带下拉刷新控件UIRefreshControl
    POJ 2421--Constructing Roads【水题 &amp;&amp; 最小生成树 &amp;&amp; kruskal】
    ORACLE-017:SQL优化-is not null和nvl
    数据结构——栈
    数据结构——静态链表
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3230125.html
Copyright © 2020-2023  润新知