include< bits/stdc++.h>
using namespace std;
const int N=6; //题目中的数据是5X5的二维字符数组,在结尾处有\0
//g[][]用来存储25盏灯的初始状态
char g[N][N],backup[N][N]; //backup[][]用来备份这25盏灯
int dx[5]={-1,0,1,0,0},dy[5]={0,1,0,-1,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; //字符1的ASCII码为49,0的ASCII码为48转化为二进制最后一位分别是1,0
} //^表示异或运算 0^1=1,1^1=0
} //通过位运算来优化操作
int main()
{
int q;
cin>>q;
while(q--) //执行q次操作
{
for(int i=0;i<5;i++) cin>>g[i]; //输入25盏灯的状态
int res = 10; //初始化答案,只要大于6即可
for(int op=0;op<32;op++) //第一行一共5个元素可以操作2^5=32次
{ //从一行开始枚举进行操作
memcpy(backup,g,sizeof g); //备份25盏灯
int step=0; //step用来存储操作的次数
for(int i=0;i<5;i++)
{
if(op>>i&1) //右移i位与1相当于表示第一行第5-i个位置
{
step++; //操作步数加1
turn(0,4-i); //进行操作
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
if(g[i][j]=='0') //如果这个位置的灯是灭的
{
step++; //步骤数加1
turn(i+1,j); //对该位置的下一行进行操作
}
}
}
bool dark=false; //dark变量表示最后一行是否全亮
for(int i=0;i<5;i++)
{
if(g[4][i]=='0') //如果最后一行出现不亮的灯0
{
dark=true; //dark为真
break; //终止循环
}
}
if(!dark) res=min(res,step); //最后一行全都亮表示所有灯都点亮了
memcpy(g,backup,sizeof g); //本次循环结束后将初始状态复原到g数组
}
if(res>6) res=-1; //大于6输出-1
cout<<res<<endl; //输出答案
}
return 0;
}
//转载大佬题解,太清晰,好东西,需要多多转发