递推与递归1:费解的开关
作者:
总打瞌睡的天天啊
,
2024-08-04 09:54:29
,
所有人可见
,
阅读 3
//解题思路:每盏灯的状态只与按的次数有关,
//知第一行确定后 ,剩下的行都确定了
//因此只需要便利第一行按的次数
#include<iostream>
#include<cstring>
using namespace std;
const int N=6;
char g[N][N],bg[N][N];
int dx[5]={0,1,0,-1,0},dy[5]={1,0,-1,0,0};
void turn(int x,int y)
{
for(int i=0;i<5;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a<0||a>=5||b<0||b>=5)continue;
g[a][b]^=1;
}
return ;
}
int main()
{
int n;
cin>>n;
while(n--)
{
for(int i=0;i<5;i++)cin>>bg[i];
//结果
int res=100;
//枚举所有第一行的改变情况
for(int op=0;op<32;op++)
{
int cnt=0;
memcpy(g,bg,sizeof g);
for(int j=0;j<5;j++)
if(op>>j&1)
{
turn(0,j);
cnt++;
}
//按第二三四行
for(int i=0;i<4;i++)
for(int j=0;j<5;j++)
if(g[i][j]=='0')
{
turn(i+1,j);
cnt++;
}
bool success=true;
//检查最后一行
for(int i=0;i<5;i++)
if(g[4][i]=='0')success=false;
// cout<<cnt<<' ';
if(success&&res>cnt)res=cnt;
}
if(res>6)res=-1;
cout<<res<<endl;
}
return 0;
}