• $Poj2956/AcWing116 The Pilots Brothers'Refrigerator$ 二进制


    AcWing

    $Sol$

    假设改变$[x1,y1]$和$[x2,y2]$的状态就可以达到目的.注意到先改变谁对结果是没有影响的!!

    所以就可以直接枚举改变状态的结点而不需要注意顺序.

    $4*4$的矩阵,看成一个十六位的二进制数,枚举这个二进制数就是枚举方案了.

    $over!$

    $Code$

    #include<bits/stdc++.h>
    #define il inline
    #define Rg register
    #define go(i,a,b) for(Rg int i=a;i<=b;++i)
    #define yes(i,a,b) for(Rg int i=a;i>=b;--i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    #define db double
    using namespace std;
    il int read()
    {
        Rg int x=0,y=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
        return x*y;
    }
    bool mp[5][5],nw[5][5];
    int as=1e7,ans[20],tmp[20];
    il void sol(int x)
    {
        go(i,1,4)go(j,1,4)nw[i][j]=mp[i][j];
        Rg int sum=0;
        go(k,1,16)
            if((1<<k-1)&x)
            {
                tmp[++sum]=k;
                Rg int h=(k-1)/4+1,l=k-4*(h-1);
                go(i,1,4)nw[i][l]^=1;
                go(j,1,4)if(j!=l)nw[h][j]^=1;
            }
        go(i,1,4)go(j,1,4)if(!nw[i][j])return;
        if(sum<as){as=sum;go(i,1,sum)ans[i]=tmp[i];}
    }
    int main()
    {
        go(i,1,4)
        {
            string s;cin>>s;
            go(j,1,4)if(s[j-1]=='-')mp[i][j]=1;
        }
        Rg int maxs=(1<<16)-1;
        go(i,0,maxs)sol(i);
        printf("%d
    ",as);
        go(i,1,as)printf("%d %d
    ",(ans[i]-1)/4+1,(ans[i]%4)==0?4:ans[i]%4);
        return 0;
    }
    View Code
    光伴随的阴影
  • 相关阅读:
    JavaSE-方法覆盖的注意事项
    underscore.js源码研究(4)
    underscore.js源码研究(3)
    移动端font-size适配方案
    控制台引入想要的库
    页面布局与编写(续3)
    underscore.js源码研究(2)
    全屏使用swiper.js过程中遇到的坑
    模块加载
    underscore.js源码研究(1)
  • 原文地址:https://www.cnblogs.com/forward777/p/11279239.html
Copyright © 2020-2023  润新知