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

AcWing

 

$Sol$

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

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

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

$over!$

 

$Code$

$Poj2956/AcWing116\ The\ Pilots\ Brothers'Refrigerator$ 二进制
#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$ 二进制

上一篇:$Luogu2512/CH122\ AcWing122$糖果传递 模拟


下一篇:$Poj3714/AcWing\ Raid$ 分治/平面最近点对