#include #include #include using namespace std; enum DIRECTION { NORTH, EAST, SOUTH, WEST }; char rotated_edge(const string &piece, int rotation, int direction) { return piece[(rotation + direction) % 4]; } bool match(char c1, char c2) { return (abs((int)c1 - (int)c2) == 0x20); } int recursive(const string pieces[9], bool used[9], vector< pair > &arranging, int n) { if (arranging.size() >= 9) { return n+1; } for (int i = 0; i < 9; i++) { if (used[i]) { continue; } used[i] = true; for (int j = 0; j < 4; j++) { arranging.push_back(make_pair(i, j)); bool flag = true; if (arranging.size() % 3 != 1) { if (!match(rotated_edge(pieces[arranging[arranging.size() - 2].first], arranging[arranging.size() - 2].second, EAST), rotated_edge(pieces[arranging[arranging.size() - 1].first], arranging[arranging.size() - 1].second, WEST))) { flag = false; } } if (arranging.size() > 3) { if (!match(rotated_edge(pieces[arranging[arranging.size() - 4].first], arranging[arranging.size() - 4].second, SOUTH), rotated_edge(pieces[arranging[arranging.size() - 1].first], arranging[arranging.size() - 1].second, NORTH))) { flag = false; } } if (flag) { n = recursive(pieces, used, arranging, n); } arranging.pop_back(); } used[i] = false; } return n; } int main() { int N; cin >> N; for (int I = 0; I < N; I++) { string pieces[9]; for (int i = 0; i < 9; i++) { cin >> pieces[i]; } bool used[9]; vector< pair > arranging; for (int i = 0; i < 9; i++) { used[i] = false; } cout << recursive(pieces, used, arranging, 0) << endl; } return 0; }