zoukankan      html  css  js  c++  java
  • HDU1429+bfs+状态压缩

    bfs+状态压缩
    思路:用2进制表示每个钥匙是否已经被找到。、

      1 /*
      2 bfs+状态压缩
      3 思路:用2进制表示每个钥匙是否已经被找到。
      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 = (1<<10)+5;  
     26 const int maxn = 22;
     27 
     28 bool vis[ maxn ][ maxn ][ maxm ];
     29 char mat[ maxn ][ maxn ];
     30 struct Point {
     31     int x,y,ti,key;
     32 };
     33 Point s,e;
     34 queue<Point>q;
     35 
     36 int bfs( int n,int m,int sumT ){
     37     memset( vis,false,sizeof( vis ) );
     38     while( !q.empty() )
     39         q.pop();
     40     Point cur;
     41     cur = s;
     42     vis[ cur.x ][ cur.y ][ cur.key ] = true;
     43     q.push( cur );
     44     while( !q.empty() ){
     45         cur = q.front();
     46         q.pop();
     47         if( cur.x==e.x && cur.y==e.y  ){
     48             e.ti = min( e.ti,cur.ti );
     49         }
     50         if( cur.ti>=sumT ) continue;
     51         for( int i=0;i<4;i++ ){
     52             Point nxt ;
     53             nxt.x = cur.x + dx[ i ];
     54             nxt.y = cur.y + dy[ i ];
     55             nxt.ti = cur.ti + 1;
     56             nxt.key = cur.key;
     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 ]>='a' && mat[ nxt.x ][ nxt.y ]<='z' ){
     60                 nxt.key = cur.key|(1<<(mat[ nxt.x ][ nxt.y ]-'a'));
     61             }//there may be a new key
     62             if( vis[ nxt.x ][ nxt.y ][ nxt.key ]==true )
     63                 continue;
     64             vis[ nxt.x ][ nxt.y ][ nxt.key ] = true;
     65             if( mat[ nxt.x ][ nxt.y ]>='A' && mat[ nxt.x ][ nxt.y ]<='Z' ){
     66                 if( nxt.key&(1<<(mat[ nxt.x ][ nxt.y ]-'A')) ){
     67                     q.push( nxt );
     68                 }
     69             }
     70             else 
     71                 q.push( nxt );
     72         }
     73     }
     74     if( e.ti>=sumT )
     75         return -1;
     76     else
     77         return e.ti;
     78 }
     79             
     80 int main(){
     81     int n,m,sumT;
     82     while( scanf("%d%d%d",&n,&m,&sumT)==3 ){
     83         for( int i=0;i<n;i++ ){
     84             scanf("%s",mat[ i ]);
     85             for( int j=0;j<m;j++ ){
     86                 if( mat[ i ][ j ]=='@' ){
     87                     s.x = i;
     88                     s.y = j;
     89                     s.ti = 0;
     90                     s.key = 0;
     91                     mat[ i ][ j ] = '.';
     92                 }
     93                 if( mat[ i ][ j ]=='^' ){
     94                     e.x = i;
     95                     e.y = j;
     96                     e.ti = sumT+1;
     97                     mat[ i ][ j ] = '.';
     98                 }
     99             }
    100         }
    101         printf("%d
    ",bfs( n,m,sumT ));
    102     }
    103     return 0;
    104 }
    View Code
    keep moving...
  • 相关阅读:
    进程与线程
    the art of seo(chapter seven)
    the art of seo(chapter six)
    the art of seo(chapter five)
    the art of seo(chapter four)
    the art of seo(chapter three)
    the art of seo(chapter two)
    the art of seo(chapter one)
    Sentinel Cluster流程分析
    Sentinel Core流程分析
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3395254.html
Copyright © 2011-2022 走看看