//main:输入多组测试数据,输入数据,拷贝,遍历所有第一行的方案,是1就转动开关,遍历1到4行,关就按下
//下一行开关,最后判断第一行是否有关的,得到最小值,拷贝,输出
//得到一些性质,确定一些东西,找出一点规律,递推嘛
//难题就是难在组合拳,所以如果你发现时间允许那就是可以先用暴力枚举算出来,多种算法组合在一起
//只有0,1就可以转化为二进制遍历所有方案
//字符'1'变成字符'0'字符’0‘变成字符’1‘可以直接异或1
#include<iostream>
#include<cstring>
using namespace std;
const int N=6;
char g[N][N],backup[N][N];
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,b;
a=x+dx[i],b=y+dy[i];
if(a>=0&&a<5&&b>=0&&b<5)//判断不越界
{
g[a][b]^=1;//字符'1'变成字符'0'字符’0‘变成字符’1‘可以直接异或1
}
}
}
int main()
{
int T;cin>>T;
while(T--)
{
int res=20;//求最小初始化为最大
for(int i=0;i<5;i++)cin>>g[i];
memcpy(backup,g,sizeof g);
for(int op=0;op<=31;op++)//二进制枚举第一行
{
int cnt=0;
for(int i=0;i<5;i++)
{
if(op>>i&1)//二进制是1就改变
{
turn(0,i);
cnt++;
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
if(g[i][j]=='0')//第0层确定,后面的除最后层都随上一层唯一确定,要改变的,一定通过
//后一层改变,核心思路:只能通过特定的几个位置改变我当前这个位置达到一一确定,递推效果
{
turn(i+1,j);
cnt++;
}
}
}
bool close=false;
for(int i=0;i<5;i++)//判断是否有暗灯
{
if(g[4][i]=='0')
{
close=true;
break;
}
}
if(!close)res=min(res,cnt);//没有暗灯满足条件,更新最小值
memcpy(g,backup,sizeof g);
}
if(res>6)res=-1;
cout<<res<<endl;
}
return 0;
}