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...
  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2941799.html
Copyright © 2011-2022 走看看