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

Posted DTTTTTTT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$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\n",as);
    go(i,1,as)printf("%d %d\n",(ans[i]-1)/4+1,(ans[i]%4)==0?4:ans[i]%4);
    return 0;
}
View Code

 

以上是关于$Poj2956/AcWing116 The Pilots Brothers'Refrigerator$ 二进制的主要内容,如果未能解决你的问题,请参考以下文章

差分约束POJ1201/LG SP116 Intervals

Poj 4227 反正切函数的应用

Poj 4227 反正切函数的应用

根据经纬度查询附近企业 | SQL

mysql计算距离最近的店铺

POJ 2752 Seek the Name, Seek the Fame