#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<map>
using namespace std;
int a[5][5],h;
struct Pos
{
int x,y;
}pos[20];
int value(int x,int y,int type) //评价此时局面
{
int start = a[x][y];
a[x][y] = type;
int temp;
if(type == 1) temp = 2;
else temp = 1;
//直接胜利
if(a[1][1] == type && a[2][2] == type && a[3][3] == type) return 100000;
if(a[1][3] == type && a[2][2] == type && a[3][1] == type) return 100000;
for(int i=1;i<=3;i++)
{
if(a[i][1] == type && a[i][2] == type && a[i][3] == type) return 100000;
if(a[1][i] == type && a[2][i] == type && a[3][i] == type) return 100000;
}
int sum = 0;
//对方有2连枝, // 一开始没注意,2连枝,每一直线有3种情况
if(a[1][1] == temp && a[2][2] == temp && a[3][3] == 0) sum += -100000;
if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0) sum += -100000;
if(a[1][1] == temp && a[3][3] == temp && a[2][2] == 0) sum += -100000;
if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0) sum += -100000;
if(a[1][3] == temp && a[2][2] == temp && a[3][1] == 0) sum += -100000;
if(a[3][1] == temp && a[1][3] == temp && a[2][2] == 0) sum += -100000;
for(int i=1;i<=3;i++)
{
if(a[i][1] == temp && a[i][2] == temp && a[i][3] == 0) sum += -100000;
if(a[i][2] == temp && a[i][3] == temp && a[i][1] == 0) sum += -100000;
if(a[i][1] == temp && a[i][3] == temp && a[i][2] == 0) sum += -100000;
if(a[1][i] == temp && a[2][i] == temp && a[3][i] == 0) sum += -100000;
if(a[2][i] == temp && a[3][i] == temp && a[1][i] == 0) sum += -100000; //i 和 数字 写反了
if(a[1][i] == temp && a[3][i] == temp && a[2][i] == 0) sum += -100000;
}
//对方有单连枝
if(a[1][1] == temp && a[2][2] == 0 && a[3][3] == 0) sum += -10;
if(a[2][2] == temp && a[3][3] == 0 && a[1][1] == 0) sum += -10;
if(a[3][3] == temp && a[2][2] == 0 && a[1][1] == 0) sum += -10;
if(a[1][3] == temp && a[2][2] == 0 && a[3][1] == 0) sum += -10;
if(a[3][1] == temp && a[2][2] == 0 && a[1][3] == 0) sum += -10;
if(a[2][2] == temp && a[3][1] == 0 && a[1][3] == 0) sum += -10;
for(int i=1;i<=3;i++)
{
if(a[i][1] == temp && a[i][2] == 0 && a[i][3] == 0) sum += -10;
if(a[i][2] == temp && a[i][3] == 0 && a[i][1] == 0) sum += -10;
if(a[i][3] == temp && a[i][2] == 0 && a[i][1] == 0) sum += -10;
if(a[1][i] == temp && a[2][i] == 0 && a[3][i] == 0) sum += -10;
if(a[2][i] == temp && a[3][i] == 0 && a[1][i] == 0) sum += -10;
if(a[3][i] == temp && a[2][i] == 0 && a[1][i] == 0) sum += -10;
}
//每有一个2连枝且有机会组成3连枝 加100分
if(a[1][1] == type && a[2][2] == type && a[3][3] == 0) sum += 100;
if(a[3][3] == type && a[2][2] == type && a[1][1] == 0) sum += 100;
if(a[3][3] == type && a[1][1] == type && a[2][2] == 0) sum += 100;
if(a[1][3] == type && a[2][2] == type && a[3][1] == 0) sum += 100;
if(a[3][1] == type && a[2][2] == type && a[1][3] == 0) sum += 100;
if(a[3][1] == type && a[1][3] == type && a[2][2] == 0) sum += 100;
for(int i=1;i<=3;i++)
{
if(a[i][1] == type && a[i][2] == type && a[i][3] == 0) sum += 100;
if(a[i][2] == type && a[i][3] == type && a[i][1] == 0) sum += 100;
if(a[i][1] == type && a[i][3] == type && a[i][2] == 0) sum += 100;
if(a[1][i] == type && a[2][i] == type && a[3][i] == 0) sum += 100;
if(a[2][i] == type && a[3][i] == type && a[1][i] == 0) sum += 100;
if(a[1][i] == type && a[3][i] == type && a[2][i] == 0) sum += 100;
}
//每有一个单连枝且有机会组成3连枝 加10分
if(a[1][1] == type && a[2][2] == 0 && a[3][3] == 0) sum += 10;
if(a[2][2] == type && a[3][3] == 0 && a[1][1] == 0) sum += 10;
if(a[3][3] == type && a[2][2] == 0 && a[1][1] == 0) sum += 10;
if(a[1][3] == type && a[2][2] == 0 && a[3][1] == 0) sum += 10;
if(a[3][1] == type && a[2][2] == 0 && a[1][3] == 0) sum += 10;
if(a[2][2] == type && a[3][1] == 0 && a[1][3] == 0) sum += 10;
for(int i=1;i<=3;i++)
{
if(a[i][1] == type && a[i][2] == 0 && a[i][3] == 0) sum += 10;
if(a[i][2] == type && a[i][3] == 0 && a[i][1] == 0) sum += 10;
if(a[i][3] == type && a[i][2] == 0 && a[i][1] == 0) sum += 10;
if(a[1][i] == type && a[2][i] == 0 && a[3][i] == 0) sum += 10;
if(a[2][i] == type && a[3][i] == 0 && a[1][i] == 0) sum += 10;
if(a[3][i] == type && a[2][i] == 0 && a[1][i] == 0) sum += 10;
}
//printf("%d %d %d\n",x,y,sum);
a[x][y] = start;
return sum;
}
int select(int ct)
{
while(1)
{
if(ct == 0 ) break;
if(ct % 2 == 1)
{
int max = -100,posi,num;
for(int i=0;i<h;i++)
{
if(pos[i].x != 0 && pos[i].y != 0 )
{
num = value(pos[i].x,pos[i].y,1);
if(max < num)
{
max = num;
posi = i;
}
}
}
if(max == 100000) return ct;
a[pos[posi].x][pos[posi].y] = 1;
pos[posi].x = 0;
pos[posi].y = 0;
}
else
{
int max = -100,posi,num;
for(int i=0;i<h;i++)
{
if(pos[i].x != 0 && pos[i].y != 0 )
{
num = value(pos[i].x,pos[i].y,2);
if(max < num)
{
max = num;
posi = i;
}
}
}
if(max == 100000) return -ct;
a[pos[posi].x][pos[posi].y] = 2;
pos[posi].x = 0;
pos[posi].y = 0;
}
ct--;
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
for(int x=0;x<t;x++)
{
int sum = 0;
h = 0;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j] == 0)
{
sum++;
pos[h].x = i;
pos[h].y = j;
h++;
}
}
}
if(value(0,0,1) == 100000) printf("%d\n",sum+1);
else if(value(0,0,2) == 100000) printf("%d\n",-(sum+1));
else printf("%d\n",select(sum));
}
return 0;
}