【tyvj-1266】费解的开关(状压枚举)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coldfresh/article/details/88056531

题目链接
题目大意:给一个5*5的的灯泡,0代表暗,1代表亮,有一个操作,多一个灯泡操作,使得本身和上下左右的的灯泡的状态相反,问能否在6步之内,使得所有的灯泡的都变亮,求最小的操作的步数,如果无解或者步数大于6则输出-1

**思路:**枚举第一排的操作数,那么接下来的2到5排的操作实际上都是确定的,那么就二进制的去枚举第一排的情况,一共是32种。
代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int _map[5][5];
int now[5][5];
char c[5][5];
int main()
{
    int n;cin>>n;
    while(n--)
    {

        for(int i=0;i<5;i++)
            scanf("%s",c[i]);
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
                if(c[i][j]=='0')_map[i][j]=0;
                else _map[i][j]=1;
        int ans=7;
        for(int s=0;s<32;s++)
        {
            int _count=0;
            for(int i=0;i<5;i++)
                for(int j=0;j<5;j++)
                    now[i][j]=_map[i][j];
            for(int i=0;i<5;i++)
            {
                if(s&(1<<i))
                {
                   _count++;
                   now[0][i]=!now[0][i];
                   if(i>=1)now[0][i-1]=!now[0][i-1];
                   if(i<=3)now[0][i+1]=!now[0][i+1];
                   now[1][i]=!now[1][i];
                }
            }
            int sign=true;
            for(int i=1;i<5;i++)
            {
               for(int j=0;j<5;j++)
               {
                   if(!now[i-1][j])
                   {
                       _count++;
                       now[i][j]=!now[i][j];
                       if(j>=1)now[i][j-1]=!now[i][j-1];
                       if(j<=3)now[i][j+1]=!now[i][j+1];
                       if(i<=3)now[i+1][j]=!now[i+1][j];
                   }
               }
               if(_count>6)
               {
                   sign=false;
                   break;
               }
            }
            for(int i=0;i<5;i++)
            {
               if(!now[4][i])
               {
                   sign=false;
                   break;
               }
            }
            if(sign)ans=min(ans,_count);
        }
        if(ans==7)cout<<-1<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Coldfresh/article/details/88056531