**
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N = 6;
static int[] dx ={-1,0,1,0,0};
static int[] dy ={0,1,0,-1,0};//上下左右中 偏移量
static char[][] g = new char[N][N];
static char[][] backup = new char[N][N];
// 这个操作是把(x, y)以及上下左右的灯都变成相反的颜色
static 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] = '0' + ('1' - g[a][b])
g[a][b] ^= 1; //异或,不同的时候就变成相反的数
//【‘0’ ASCII值48 ‘1’ 49】
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
while(n-- >0) {
// 按行输入,把每一行当成一个字符串 然后转换成字符数组
for(int i=0;i<5;i++) g[i] = in.next().toCharArray();
int res = 7;
//第一行覆盖所有状态
for(int op=0;op<32;op++){
// 我在对这种情况操作的时候,得先备用一下
// 把原始数组备份一下,然后操作g,操作完了还原,然后再操作
for(int j=0;j<5;++j)
{
backup[j]=Arrays.copyOf(g[j], 5);
}
int step = 0;
//计算翻转操作的step
for (int i = 0; i < 5; ++i)
{
if ((op>>i & 1) == 1)
{
step++;
turn(0,i);
}
}
//然后通过第一行按完之后的状态,按234行 递推
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 5; ++j)
{
if (g[i][j] == '0')
{
step++;
// 如果这个位置是灭的,就按下一行对应的位置
turn(i+1,j);
}
}
boolean dark = false;
for (int j = 0; j < 5; j ++ )
if (g[4][j] == '0')
{
dark = true;
break;
}
// 判断可行性 可行的话 是否更优
if (!dark) res = Math.min(res, step);
for(int j=0;j<5;++j)
{
g[j]=Arrays.copyOf(backup[j], 5);
}
}
if(res > 6) res = -1;
System.out.println(res);
}
}
}