import java.util.*;import java.io.*;classMain{
Scanner s =newScanner(System.in);// 矩阵数量int n;// 输入的每一行
String line;// char数组char[][] g;publicvoidrun(){
n = s.nextInt();
g =newchar[5][5];while(n-->0){// 填充数组for(int i =0; i <5; i++){
line = s.next();for(int j =0; j <5; j++){
g[i][j]= line.charAt(j);}}// 输出每次输入的g的ansminStep(g);}}publicvoidminStep(char[][] c){// 输入数组的替身char[][] backup =newchar[5][5];for(int k =0; k <5; k++){
System.arraycopy(c[k],0, backup[k],0,5);}int ans =7;// 先枚举出第一行的所有操作情况for(int op =0; op <32; op++){// 每次op让step归0int step =0;// 二进制数中对数字为1的位置进行翻转 for(int i =0; i <5; i++){if((op >> i &1)==1){turn(backup,0, i);
step++;}}// 从第一行到第四行开始扫描for(int i =0; i <4; i++){for(int j =0; j <5; j++){// 如果当前行的当前列元素为0则对下一行对应位置进行翻转if(backup[i][j]=='0'){turn(backup, i +1, j);
step++;}}}boolean bright =true;// 扫描最后一行元素,判断其是否全为1for(int i =0; i <5; i++){if(backup[4][i]!='1'){
bright =false;}}// 如果最后一行全亮,则本次op有效,与前一次的移动步数比较,以至于所有op结束后找到最小值if(bright){
ans = Math.min(ans, step);}// 恢复替身改变之前的状态for(int k =0; k <5; k++){
System.arraycopy(c[k],0, backup[k],0,5);}}// 判断最小步数是否大于6,如果大于6则返回-1if(ans >6) ans =-1;
System.out.println(ans);}// 关于(x, y)的5个点偏移量int[] dx ={-1,0,1,0,0};int[] dy ={0,1,0,-1,0};publicvoidturn(char[][] c,int x,int y){for(int i =0; i <5; i++){// (a, b)为(x, y)附加对应偏移量的点int a = x + dx[i];int b = y + dy[i];// 判断一下边界,如果越界,这该点无效,不需要翻转if(a <0|| a >=5|| b <0|| b >=5)continue;// 对该点进行翻转
c[a][b]= c[a][b]=='1'?'0':'1';}}publicstaticvoidmain(String[] args){newMain().run();}}