#include<bits/stdc++.h>
using namespace std;
 
struct data{
  int a,b,c,id;
 
  bool operator < (const data& p) const{
    if(a!=p.a)return a<p.a;
    if(b!=p.b)return b<p.b;
    if(c!=p.c)return c<p.c;
    return false;
  }
};
 
string t[5][5];
bool u[5][5];
 
double ans=0;
int target;
 
bool used[10];
double mem[10];
double calc(int x){
  if(used[x])return mem[x];
  used[x]=true;
 
  double A=1;
 
  for(int i=8;i>8-x;i--)A*=(double)i;
 
  for(int i=1;i<=x;i++)A/=(double)i;
 
  for(int i=1;i<=x;i++)
    A*=0.25;
 
  for(int i=1;i<=(8-x);i++)
    A*=0.75;
 
  return mem[x]=A;
}
 
bool eq(data a,data b){
  if(a<b)return false;
  if(b<a)return false;
  return true;
}
 
double func(vector<data> vec,int k,bool debug=false){
  if(k<0)return 0;
  int size=vec.size();
 
  if(size<=k+1)return 1.0;
 
  for(int i=0;i<size;i++)
    vec[i].a=vec[i].b=vec[i].c=0;
   
  for(int i=0;i<size;i++){
    for(int j=0;j<size;j++){
 
      int ai=vec[i].id+1;
      int aj=vec[j].id+1;
      if(ai>=aj)continue;
 
      int vi=t[ai][aj][1]-'0';
      int vj=t[ai][aj][3]-'0';
       
      vec[i].b+=(vi-vj);
      vec[j].b+=(vj-vi);
 
      vec[i].c+=vi;
      vec[j].c+=vj;
 
      if(vi>vj)vec[i].a+=3;
      else if(vi<vj)vec[j].a+=3;
      else vec[i].a++,vec[j].a++;
    }
  }
 
 
 
  bool flag=true;
  for(int i=0;i<size;i++)
    if( !eq(vec[i],vec[0]) )flag=false;
  if(flag)return ( (double)(k+1) / (double)size);
   
  sort(vec.begin(),vec.end());
  reverse(vec.begin(),vec.end());
 
  if(debug){
    for(int i=0;i<size;i++){
      cout<<vec[i].a<<' '<<vec[i].b<<' '<<vec[i].c<<' '<<vec[i].id<<endl;
    }
    cout<<endl;
  }
 
  vector<data> divi[4];
  int C=0,tc;
 
  for(int i=0;i<size;i++){
    if(i>0&&!eq(vec[i],vec[i-1]))C++;
    divi[C].push_back(vec[i]);
    if(vec[i].id==target)tc=C;
  }
 
  int sum=0;
  for(int i=0;i<tc;i++)
    sum+=(int)divi[i].size();
   
  if(sum>k)return 0.0;
  return func( divi[tc], k-sum);
}
 
int cc=0;
void check(double p){
  vector<data> vec(4);
  for(int i=0;i<4;i++)vec[i].id=i;
  ans+=p*func(vec,1, (cc==2) );
}
 
void dfs(int y,int x,double p){
 
  if(y==4){
    check(p);
    return;
  }
  if(x==5){
    dfs(y+1,1,p);
    return;
  }
  if(y>=x){
    dfs(y,x+1,p);
    return;
  }
 
 
 
 
 
  if(u[y][x]){
 
    for(int i=0;i<=8;i++){
      for(int j=0;j<=8;j++){
        t[y][x][1]= ('0'+i);
        t[y][x][3]= ('0'+j);
        dfs(y,x+1,p*calc(i)*calc(j));
      }
    }
 
  }else{
    dfs(y,x+1,p);
  }
 
}
 
int main(){
  int Tc;
  cin>>Tc;
  while(Tc--){
    for(int i=0;i<5;i++){
      string s;
      cin>>s;
      for(int j=0;j<5;j++){
        t[i][j]=s.substr(j*5,4);
      }
    }    
    for(int i=1;i<5;i++)
      if(t[i][0][0]=='*')target=i-1;
    memset(u,false,sizeof(u));
 
    for(int i=1;i<5;i++)
      for(int j=1;j<5;j++)
        if(t[i][j][1]=='_')
          u[i][j]=true;
 
    ans=0;
    dfs(1,1,1);
 
    printf("%.10f\n",ans);
  }
   
  return 0;
}