$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

 

转载于:https://www.cnblogs.com/forward777/p/11279239.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值