zoukankan      html  css  js  c++  java
  • poj 1753

    poj 1753
    做搜索题还是要找到特殊性质和枚举方式
    哪怕很简单的性质,也会产生很大的影响
    在这个题中,同一个格子翻2次和不翻没有区别,在这里有一个小细节就是可以有impossible的情况,这也意味着所有情况都可以在规定时间内枚举到,这也就是你枚举所有情况就可以了。
    这题还有一个巧妙的方法
    如果第一行是确定的,那么从第二行开始把上一行变成全黑或全白的情况是唯一的。找到联系后,所有情况也就2*16种了。
    剩下的就是技巧了,比如状压,位运算,进制等等。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #include<map>
      9 #include<stack>
     10 #include<cstring>
     11 #define inf 2147483647
     12 #define ls rt<<1
     13 #define rs rt<<1|1
     14 #define lson ls,nl,mid,l,r
     15 #define rson rs,mid+1,nr,l,r
     16 #define N 100010
     17 #define For(i,a,b) for(int i=a;i<=b;i++)
     18 #define p(a) putchar(a)
     19 #define g() getchar()
     20 
     21 using namespace std;
     22 int dx[]={0,1,-1,0,0};
     23 int dy[]={0,0,0,1,-1};
     24 char c[10];
     25 int st;
     26 int ans=inf;
     27 //black为1,white为0
     28 void in(int &x){
     29     int y=1;
     30     char c=g();x=0;
     31     while(c<'0'||c>'9'){
     32         if(c=='-')y=-1;
     33         c=g();
     34     }
     35     while(c<='9'&&c>='0'){
     36         x=(x<<1)+(x<<3)+c-'0';c=g();
     37     }
     38     x*=y;
     39 }
     40 void o(int x){
     41     if(x<0){
     42         p('-');
     43         x=-x;
     44     }
     45     if(x>9)o(x/10);
     46     p(x%10+'0');
     47 }
     48 
     49 int file(int xx,int yy,int temp){
     50     For(i,0,4){
     51         int x=xx+dx[i],y=yy+dy[i];
     52         if(x>=0&&x<4&&y>=0&&y<4)
     53         temp^=1<<(15-4*x-y);
     54     }
     55     return temp;
     56 } 
     57 
     58 void dfs(int cur,int num,int state,int flag){
     59     if(cur==4&&(state==0xffff||state==0)){
     60         ans=min(ans,num);
     61     }
     62     if(cur==4)return;
     63     int i=cur-1;
     64     For(j,0,3){
     65         if(((state&(1<<(15-4*i-j)))>>(15-4*i-j))^flag){
     66             state=file(cur,j,state);
     67             num++;
     68         }
     69     }
     70     dfs(cur+1,num,state,flag);
     71 }
     72 
     73 void en(int st){
     74     For(i,0,15){
     75         int num=0,state=st;
     76         For(j,0,3)
     77             if(i&(1<<j)){
     78                 num++;
     79                 state=file(0,j,state);
     80             }
     81         dfs(1,num,state,0);
     82         dfs(1,num,state,1);
     83     }
     84 }
     85 
     86 int main(){
     87     For(i,0,3){
     88         cin>>c;
     89         For(i,0,3){
     90             st<<=1;
     91             st+=(c[i]=='b'?1:0);
     92         }
     93     }
     94     en(st);
     95     if(ans==inf)
     96         cout<<"Impossible";
     97     else
     98         cout<<ans;
     99     return 0;
    100 }
    View Code
  • 相关阅读:
    (原)Lazarus 异构平台下多层架构思路、DataSet转换核心代码
    (学)新版动态表单研发,阶段成果3
    (学) 如何将 Oracle 序列 重置 清零 How to reset an Oracle sequence
    (学)XtraReport WebService Print 报错
    (原)三星 i6410 刷机 短信 无法 保存 解决 办法
    (原) Devexpress 汉化包 制作工具、测试程序
    linux下网络配置
    apache自带ab.exe小工具使用小结
    Yii::app()用法小结
    PDO使用小结
  • 原文地址:https://www.cnblogs.com/war1111/p/10310824.html
Copyright © 2011-2022 走看看