#include<iostream> #include<cstdio> #include<cstring> #define MAXN 1<<8 #define max(x,y) x > y ? x : y #define J(u,d,k) !((u>>k)&d) && !((u<<k)&d) int n, num[MAXN], ins[9] ; int dp[9][11][MAXN][MAXN] ; int s[9][MAXN] ; void getTable() { int i, j, k ; for(i = 1 ; i <= 8 ; i ++) { for(k = j = 0 ; j < MAXN ; j ++) if(!(j&ins[i]) ) s[i][++k] = j ; s[i][0] = k ; } } int stateDP() { int i, j, k, l, x, y ; int ans = 0 ; memset(dp, 0, sizeof(dp)) ; for(i = 1 ; i <= s[1][0] ; i ++) for(j = 1 ; j <= s[2][0] ; j ++) if(J(s[1][i], s[2][j], 2)) dp[2][ num[s[1][i]]+num[s[2][j]] ][i][j] = 1 ; for(i = 3 ; i <= 8 ; i ++) { for(j = 1 ; j <= s[i-1][0] ; j ++) for(k = 1 ; k <= s[i][0] ; k ++) { if(!J(s[i-1][j], s[i][k], 2)) continue ; x = num[s[i-1][j]] + num[s[i][k]] ;// for( ; x <= n ; x ++ ) { for(l = 1 ; l <= s[i-2][0] ; l ++) if(J(s[i-2][l], s[i][k], 1) && J(s[i-2][l], s[i-1][j], 2)) { dp[i][x][j][k] += dp[i-1][ x-num[s[i][k]] ][l][j] ; } } } } for(i = 1 ; i <= s[7][0] ; i ++) for(j = 1 ; j <= s[8][0] ; j ++) if(J(s[7][i], s[8][j], 2))ans += dp[8][n][i][j] ; return ans ; } int main() { int i, j, T ; char str[10] ; for(i = 0 ; i < MAXN ; i ++) for(num[i] = j = 0 ; j < 8 ; j ++) num[i] = i&(1<<j) ? num[i]+1 : num[i] ; scanf("%d", &T) ; while(T --) { scanf("%d", &n) ; for(i = 1 ; i <= 8 ; i ++) { scanf("%s", str) ; for(ins[i] = j = 0 ; j < 8 ; j ++) ins[i] = (str[j] == '*') ? ins[i]+(1<<j) : ins[i] ; } getTable() ; printf("%d\n", stateDP()) ; } return 0 ; }