• 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
  • 相关阅读:
    Scrapy学习-7-数据存储至数据库
    Scrapy学习-6-JSON数据处理
    Scrapy学习-5-下载图片实例
    Scrapy学习-4-Items类&Pipelines类
    Scrapy学习-3-Request回调巧用
    Scrapy学习-2-xpath&css使用
    iTunes.exe 在win7系统中运行出错解决办法
    [转]手机浏览器的User-Agent汇总
    apple mobile device服务无法启动,错误1053 解决
    [转]EF 4.1 Code First
  • 原文地址:https://www.cnblogs.com/war1111/p/10310824.html
Copyright © 2020-2023  润新知