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...
  • 相关阅读:
    8.存储器
    7.计算机的总线
    6.计算机的字符与编码集
    5.计算机的计量单位
    JAVA 实用插件
    并发(三)
    并发(二)
    Java 8 Lambda
    并发(一)
    Mybatis(七)-- LRU LFU 算法
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3395254.html
Copyright © 2011-2022 走看看