import java.io.*;
public class Main {
static final int N = 5; // 游戏网格的大小
static char[][] g = new char[N][N]; // 存储游戏状态
static char[][] backup = new char[N][N]; // 用于备份游戏状态
static int[] dx = {0, -1, 0, 1, 0}; // 定义翻转操作中灯的位置变化(上、下、左、右、中)
static int[] dy = {0, 0, 1, 0, -1};
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // 使用BufferedReader进行输入
// 正确翻转灯的状态,确保'0'变为'1','1'变为'0'
public 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 >= N || b < 0 || b >= N) continue; // 边界检查
g[a][b] = g[a][b] == '0' ? '1' : '0'; // 翻转字符
}
}
// 深度优先搜索(DFS)逻辑
public static int dfs() {
int res = Integer.MAX_VALUE; // 初始化最小步骤数为最大值
for (int k = 0; k < 1 << N; k++) {
// 使用clone备份游戏状态
for (int i = 0; i < N; i++) {
backup[i] = g[i].clone();
}
int step = 0;
// 对第一行执行翻转操作
for (int i = 0; i < N; i++) {
if ((k >> i & 1) == 0) {
step++;
turn(0, i);
}
}
// 根据当前行的状态决定下一行的翻转操作
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N; j++) {
if (g[i][j] == '0') {
step++;
turn(i + 1, j);
}
}
}
// 检查最后一行是否全部点亮
boolean flag = true;
for (int j = 0; j < N; j++) {
if (g[N - 1][j] == '0') {
flag = false;
break;
}
}
// 更新最小步骤数
if (flag) res = Math.min(res, step);
// 恢复游戏状态
for (int i = 0; i < N; i++) {
g[i] = backup[i].clone();
}
}
// 如果最小步骤数大于6,返回-1,否则返回最小步骤数
return res <= 6 ? res : -1;
}
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(in.readLine()); // 读取测试用例数量
while (n-- > 0) {
for (int i = 0; i < N; i++) {
g[i] = in.readLine().toCharArray(); // 读取并存储游戏状态
}
System.out.println(dfs()); // 调用dfs方法并输出结果
if (n > 0) in.readLine(); // 如果还有更多测试用例,读取下一个空行
}
in.close(); // 关闭BufferedReader
}
}