#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LIM 405 using namespace std; int ty, n, m, currS; pair mat[LIM][LIM]; // id componenta conexa din care face parte int v[LIM * LIM]; char c[LIM][LIM]; bool viz[LIM][LIM]; int d[4][2] = {{-1, 0}, {0, +1}, {+1, 0}, {0, -1}}; struct El { int sum_CC, i, j; char ch; El() { sum_CC = 0; i = -1; j = -1; ch = ' '; } El(int s, int a, int b, char c) { sum_CC = s; i = a; j = b; ch = c; } }; struct cmpStruct { bool operator() (El const &lhs, El const &rhs) const { //return lhs > rhs; // inverse if(lhs.sum_CC > rhs.sum_CC) { return 1; } else if(lhs.sum_CC < rhs.sum_CC) { return 0; } else { if(lhs.i < rhs.i) { return 1; } else if(lhs.i > rhs.i) { return 0; } else { if(lhs.j < rhs.j) { return 1; } else if(lhs.j > rhs.j) { return 0; } else { if(lhs.ch < rhs.ch) { return 1; } else if(lhs.ch > rhs.ch) { return 0; } else { return -1; } } } } } }; set s; void dfs(int ins, int jns, int id) { viz[ins][jns] = true; mat[ins][jns] = make_pair(id, c[ins][jns]); currS++; for(int i = 0; i < 4; i++) { int ni = ins + d[i][0]; int nj = jns + d[i][1]; if(ni >= 0 && ni < n && nj >= 0 && nj < m && !viz[ni][nj] && c[ins][jns] == c[ni][nj]) { dfs(ni, nj, id); } } } void responseTo2() { // int mx = -1; // int idChangei = -1, idChangej = -1; // char chChange = ' '; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { for(int v1 = 0; v1 < 4; v1++) { for(int v2 = 0; v2 < 4; v2++) { if(v1 != v2) { int ni1 = i + d[v1][0]; int nj1 = j + d[v1][1]; int ni2 = i + d[v2][0]; int nj2 = j + d[v2][1]; if(ni1 >= 0 && ni1 < n && ni2 >= 0 && ni2 < n && nj1 >= 0 && nj1 < m && nj2 >= 0 && nj2 < m) { int idCompConex1 = mat[ni1][nj1].first; int idCompConex2 = mat[ni2][nj2].first; char chCompConex1 = mat[ni1][nj1].second; char chCompConex2 = mat[ni2][nj2].second; int sum_between = v[idCompConex1] + v[idCompConex2] + 1; //cout << sum_between << "\n"; if(idCompConex1 != idCompConex2 && chCompConex1 == chCompConex2) { //cout << sum_between << "\n"; s.insert(El(sum_between, i, j, chCompConex1)); } else { int s1 = v[idCompConex1] + 1; int s2 = v[idCompConex2] + 1; //cout << s1 << " .... s2 " << s2 << "\n"; s.insert(El(s1, i, j, chCompConex1)); s.insert(El(s2, i, j, chCompConex2)); } } } } } } } El fr = *s.begin(); printf("%d %d\n", fr.i + 1, fr.j + 1); printf("%c\n", fr.ch); } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d\n", &ty); scanf("%d %d\n", &n, &m); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%c", &c[i][j]); } scanf("\n"); } int mx = -1; int idCC = 1; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(!viz[i][j]) { currS = 0; dfs(i, j, idCC); v[idCC] = currS; idCC++; mx = max(mx, currS); } } } // for(int i = 0; i < n; i++) { // for(int j = 0; j < m; j++) { // cout << mat[i][j].first << " "; // << mat[i][j].second // } // cout << endl; // } if(ty == 1) { printf("%d\n", mx); } else { responseTo2(); } return 0; }