2
#include <iostream> #include <cstring> #include <vector> using namespace std; const int MAXN = 55; int t; int n; char A[MAXN][MAXN]; int result = 0; bool circleFound = false; int offsetX[6] = {-1, -1, 0, 1, 1, 0}; int offsetY[6] = {0, 1, 1, 0, -1, -1}; bool used[MAXN][MAXN]; void findOddCircle(int x, int y, int num, int firstX, int firstY) { used[x][y] = true; for (int i = 0; i < 6; i++) { if ((x + offsetX[i] >= 0) && (x + offsetX[i] < n) && (y + offsetY[i] >= 0) && (y + offsetY[i] < n)) { if ((!used[x + offsetX[i]][y + offsetY[i]]) && (A[x + offsetX[i]][y + offsetY[i]] == 'X')) { findOddCircle(x + offsetX[i], y + offsetY[i], num + 1, firstX, firstY); if (circleFound) { break; } } else if (used[x + offsetX[i]][y + offsetY[i]]) { if ((num & 1) && (x + offsetX[i] == firstX) && (y + offsetY[i] == firstY)) { circleFound = true; break; } } } } } void cal(int i, int j) { bool firFound = false; int temp = 1; if ((j + 1 < n) && (A[i][j + 1] == 'X')) { firFound = true; temp++; } if ((i + 1 < n) && (A[i + 1][j] == 'X')) { temp++; } if (!firFound && (i + 1 < n) && (j - 1 >= 0) && (A[i + 1][j - 1] == 'X')) { temp++; } result = max(result, temp); } int main() { cin >> t; for (int i = 0; i < t; i++) { cin >> n; for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { cin >> A[j][k]; } } result = 0; for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { if (A[j][k] == 'X') { cal(j, k); } } } if (result < 3) { circleFound = false; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (A[i][j] == 'X') { memset(used, 0, sizeof(used)); findOddCircle(i, j, 1, i, j); if (circleFound) { result = 3; break; } } } if (circleFound) { break; } } } cout << result << endl; } return 0; }