题目链接
题目大意:给一个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;
}