#include #include #include #include using namespace std; typedef long long ll; int l; int a[3][3]; int check2(int e){ switch (e){ case 0: case 1: case 2: if (((a[1][e] > a[0][e] && a[1][e] > a[2][e]) || (a[1][e] < a[0][e] && a[1][e] < a[2][e])) && (a[1][e] != a[0][e] && a[1][e] != a[2][e] && a[0][e] != a[2][e])) return 1; break; case 3: case 4: case 5: if (((a[e - 3][1] > a[e - 3][0] && a[e - 3][1] > a[e - 3][2]) || (a[e - 3][1] < a[e - 3][0] && a[e - 3][1] < a[e - 3][2])) && (a[e - 3][1] != a[e - 3][0] && a[e - 3][1] != a[e - 3][2] && a[e - 3][0] != a[e - 3][2])) return 1; break; case 6: if (((a[1][1] > a[0][0] && a[1][1] > a[2][2]) || (a[1][1] < a[0][0] && a[1][1] < a[2][2])) && (a[1][1] != a[0][0] && a[1][1] != a[2][2] && a[0][0] != a[2][2])) return 1; break; case 7: if (((a[1][1] > a[2][0] && a[1][1] > a[0][2]) || (a[1][1] < a[2][0] && a[1][1] < a[2][0])) && (a[1][1] != a[2][0] && a[1][1] != a[0][2] && a[2][0] != a[0][2])) return 1; break; } return 0; } // 門松列ができているかをチェック // num でどの列かを切り替え int check(int kakunin[]){ for (int e = 0; e < 8; e++){ if (kakunin[e] == 0){ continue; } else{ if (check2(e) == 0){ return 0; } } } return 1; } void kakunin_set(int x, int y, int kakunin[]){ kakunin[x + 3]++; kakunin[y]++; if ((x + y) % 2 == 0){ kakunin[6]++; kakunin[7]++; } } int main(){ int t; cin >> t; int count = 0; // 0 になっている場所 int x[2], y[2], pair = 0; // 切る竹の長さ int length = 0; // どの列で見るかのチェック int kakunin[8] = { 0 }; // それぞれのテストケース for (int i = 0; i < t; i++){ //使った値の初期化 for (int j = 0; j < 8; j++) kakunin[j] = 0; pair = 0; count = 0; length = 1; cin >> l; for (int j = 0; j < 3; j++){ for (int k = 0; k < 3; k++){ cin >> a[k][j]; if (a[k][j] == 0){ x[pair] = k; y[pair] = j; kakunin_set(x[pair], y[pair], kakunin); pair++; } } } while (length < l){ a[x[0]][y[0]] = length; a[x[1]][y[1]] = l - length; if (check(kakunin) == 1){ count++; } length++; } cout << count << endl; } return 0; }