zoukankan      html  css  js  c++  java
  • POJ1753 BFS+位运算

    题意:翻转某些牌 使得达到目标状态

    BFS+位运算

    因为整个图比较小,所以用位运算来记录状态。

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<queue>
     5 using namespace std;
     6 const int inf = 0x7fffffff;
     7 const int maxn = 16;
     8 const int maxm = 65535;
     9 int vis[ maxm+5 ];
    10 int dis[ maxm+5 ];
    11 int mat[ maxn ][ maxn ];
    12 int bina[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
    13 int cc[16]={19,39,78,140,305,626,1252,2248,4880,10016,20032,35968,12544,29184,58368,51200};
    14 int main( int argc,char argv[] ){
    15     char a[ maxn ];
    16     int sum=0;
    17     for( int i=0;i<4;i++ ){
    18         scanf("%s",a);
    19         for( int j=0;j<4;j++ ){
    20             if( a[j]=='b' ){
    21                 mat[i][j]=1;
    22             }
    23             else{
    24                 mat[i][j]=0;
    25             }
    26             sum+=(bina[4*i+j]*mat[i][j]);
    27         }
    28     }
    29     memset( vis,0,sizeof(vis) );
    30     for( int i=0;i<=maxm;i++ )
    31         dis[ i ]=inf;
    32     if( sum==0||sum==maxm ){
    33         vis[ sum ]=1;
    34         dis[ sum ]=0;
    35     }
    36     queue<int>q;
    37     vis[ sum ]=1;
    38     dis[ sum ]=0;
    39     q.push( sum );
    40     while( !q.empty() ){
    41         int now=q.front();
    42         q.pop();
    43         if( now==0||now==maxm ){
    44             vis[ now ]=1;
    45             break;
    46         }
    47         if( vis[0]||vis[ maxm ] ){
    48             break;
    49         }
    50         for( int i=0;i<16;i++ ){
    51             int next=now^cc[i];
    52             if( vis[ next ]==0 ){
    53                 vis[ next ]=1;
    54                 dis[ next ]=dis[ now ]+1;
    55                 q.push( next );
    56             }
    57             else{
    58                 if( dis[ next ]>dis[ now ]+1 ){
    59                     dis[ next ]=dis[ now ]+1;
    60                 }
    61             }
    62         }
    63     }
    64     if( vis[ 0 ]==1 ||vis[ maxm ]==1 ){
    65         printf("%d\n",min( dis[0],dis[ maxm ] ) );
    66     }
    67     else
    68     {
    69           printf("Impossible\n");
    70     }
    71     return 0;
    72 }
    keep moving...
  • 相关阅读:
    MongoDB4.0以下版本,同一台电脑安装2个MongoDB服务
    CMake编译Mysql connector C++
    Winsock I/O方法
    查看mysql版本的四种方法(转)
    WorkBench,DELETE 标准语句失败
    Qt 透明对话框 自定义透明度
    QString 分割字符串时产生乱码的问题
    winsock error 相关
    线程的分离状态与结合状态
    Oracle 语法
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2941799.html
Copyright © 2011-2022 走看看