zoukankan      html  css  js  c++  java
  • hdu--1885--状压bfs

    这里 我花了将近10分钟找错 才发现是错在 运算符的优先级上面 =_=

    1 if( mp[xx][yy]=='B' && ( (now.key&2)==0) )

    位运算的优先级 太低了 ....

    每次多开一维来表示该点的 钥匙数  很多类似~~

     1 #include <iostream>
     2 #include <cstring>
     3 #include <queue>
     4 using namespace std;
     5 
     6 int n , m;
     7 const int size = 110;
     8 int dir[4][2] = {1,0,-1,0,0,1,0,-1};
     9 char mp[size][size];
    10 int kk[size][size];
    11 bool vis[size][size][1<<6];
    12 struct node
    13 {
    14     int x , y , key , T;
    15     node(){};
    16     node( int u , int v , int w , int p ):x(u),y(v),key(w),T(p){};
    17 };
    18 queue<node> q;
    19 
    20 void init( )
    21 {
    22     memset( kk , 0 , sizeof(kk) );
    23     memset( vis , false, sizeof(vis) );
    24     while( !q.empty() )
    25         q.pop();
    26 }
    27 
    28 int bfs( int stx , int sty )
    29 {
    30     q.push( node( stx , sty , kk[stx][sty] , 0 ) );
    31     vis[stx][sty][ kk[stx][sty] ] = true;
    32     while( !q.empty() )
    33     {
    34         node now = q.front();
    35         q.pop();
    36         //cout << "x: " << now.x << " y: " << now.y << " T: " << now.T << endl;
    37         if( mp[ now.x ][ now.y ] == 'X' )
    38             return now.T;
    39         for( int i = 0 ; i<4 ; i++ )
    40         {
    41             int xx = now.x + dir[i][0];
    42             int yy = now.y + dir[i][1];
    43             int KEY = now.key | kk[ xx ][ yy ];
    44             if( xx>=0 && xx<n && yy>=0 && yy<m && mp[xx][yy]!='#' && !vis[xx][yy][KEY] )
    45             {
    46                 if( mp[xx][yy]=='B' && ( (now.key&2)==0) )
    47                     continue;
    48                 else if( mp[xx][yy]=='Y' && ( (now.key&4)==0) )
    49                     continue;
    50                 else if( mp[xx][yy]=='R' && ( (now.key&8)==0) )
    51                     continue;
    52                 else if( mp[xx][yy]=='G' && ( (now.key&16)==0) )
    53                     continue;
    54                 q.push( node(xx,yy,KEY,now.T+1) );
    55                 vis[xx][yy][KEY] = true;
    56             }
    57         }
    58     }
    59     return -1;
    60 }
    61 
    62 int main()
    63 {
    64     cin.sync_with_stdio(false);
    65     int ans , stx , sty;
    66     while( cin >> n >> m &&(n||m) )
    67     {
    68         init();
    69         for( int i = 0 ; i<n ; i++ )
    70         {
    71             cin >> mp[i];
    72         }
    73         for( int i = 0 ; i<n ; i++ )
    74         {
    75             for( int j = 0 ; j<m ; j++ )
    76             {
    77                 if( mp[i][j]=='*' )
    78                 {
    79                     stx = i;
    80                     sty = j;
    81                 }
    82                 else if( mp[i][j]=='b' )
    83                     kk[i][j] |= (1<<1);
    84                 else if( mp[i][j]=='y' )
    85                     kk[i][j] |= (1<<2);
    86                 else if( mp[i][j]=='r' )
    87                     kk[i][j] |= (1<<3);
    88                 else if( mp[i][j]=='g' )
    89                     kk[i][j] |= (1<<4);
    90             }
    91         }
    92         ans = bfs( stx , sty );
    93         if( ans==-1 )
    94             cout << "The poor student is trapped!" << endl;
    95         else
    96             cout << "Escape possible in " << ans << " steps." << endl;
    97     }
    98     return 0;
    99 }
    View Code

    today:

      你必须先要失去什么你视之为珍贵的

      才能得到一些更为有价值即使现在的你看来一文不值的

  • 相关阅读:
    C#使用xpath简单爬取网站的内容
    Python的安装以及编译器的安装
    解析二维码
    C#的历史及IDE总结
    我又回来了,这回是带着C++来的
    Python 基础知识
    template declarations(模板声明)中 class 和 typename 有什么不同?
    投影点坐标
    内存对齐代码解析
    互斥量和信号量的区别
  • 原文地址:https://www.cnblogs.com/radical/p/4101500.html
Copyright © 2011-2022 走看看