//============================================================================ // Name : mortage.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include using namespace std; int input[2001][2001]; int main() { int m, n; while (true) { scanf("%i %i", &m, &n); if (m == 0 && n == 0) { break; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", input[i] + j); } } int bestSide = 1; // -> for (int i = 0; i < m - 1; i++) { for (int j = 0; j < n - 1; j++) { int myDer = input[i][j + 1] - input[i][j]; int myDer2 = input[i + 1][j + 1] - input[i + 1][j]; if (myDer != myDer2) { continue; } bool diagonal = false; int otherDiff = input[i][j] - input[i + 1][j]; if (input[i][j] == input[i + 1][j]) { diagonal = false; } else if (otherDiff - myDer == 0 || otherDiff + myDer == 0) { diagonal = true; } else { continue; } int s,r; // look round int size = 3; while (true) { int otherDiffTmp = input[i + size - 1][j] - input[i + size - 2][j]; if (otherDiffTmp != otherDiff) { break; } bool failed = false; for (r = 0; r < size; r++) { int x = j + size - 2; int y = i + r; if (x + 1 >= n || y >= m) { failed = true; break; } int tmpDer = input[y][x + 1] - input[y][x]; if (tmpDer != myDer) { failed = true; break; } } for (s = 0; s < size - 1; s++) { int x = j + s; int y = i + size - 1; if (x + 1 >= n || y >= m) { failed = true; break; } int tmpDer = input[y][x + 1] - input[y][x]; if (tmpDer != myDer) { failed = true; break; } } if (failed) { break; } size++; } int side = size - 1; if (side > bestSide) { bestSide = side; } } } // // v // for (int i = 0; i < m - 1; i++) { // for (int j = 0; j < n - 1; j++) { // // int myDer = input[i + 1][j] - input[i][j]; // int myDer2 = input[i + 1][j + 1] - input[i][j + 1]; // if (myDer != myDer2) { // continue; // } // // int otherDiff = input[i][j + 1] - input[i][j]; // // if (otherDiff != 0) { // continue; // } // // int s,r; // // // look round // int size = 3; // while (true) { // int otherDiffTmp = input[i][j + size - 1] - input[i][j + size - 2]; // if (otherDiffTmp != otherDiff) { // break; // } // // bool failed = false; // for (r = 0; r < size - 1; r++) { // int x = j + size - 1; // int y = i + r; // if (x >= n || y + 1 >= m) { // failed = true; // break; // } // // int tmpDer = input[y + 1][x] - input[y][x]; // if (tmpDer != myDer) { // failed = true; // break; // } // } // for (s = 0; s < size; s++) { // int x = j + s; // int y = i + size - 2; // if (x >= n || y + 1 >= m) { // failed = true; // break; // } // // int tmpDer = input[y + 1][x] - input[y][x]; // if (tmpDer != myDer) { // failed = true; // break; // } // } // if (failed) { // break; // } // // size++; // } // // int side = size - 1; // if (side > bestSide) { // bestSide = side; // } // } // } // doprava dolu // for (int i = 0; i < m - 1; i++) { // for (int j = 0; j < n - 1; j++) { // // int myDer = input[i + 1][j + 1] - input[i][j]; // int myDer2 = input[i][j + 1] - input[i][j]; // int myDer3 = input[i+1][j] - input[i][j]; // if (myDer2 != myDer3 || myDer != 2 * myDer2) { // continue; // } // // int s,r; // // // look round // int size = 3; // while (true) { // bool failed = false; // for (r = 0; r < size - 1; r++) { // int x = j + size - 2; // int y = i + r; // if (x + 1 >= n || y + 1 >= m) { // failed = true; // break; // } // // int tempDer1 = input[y + 1][x + 1] - input[y][x]; // int tempDer2 = input[y][x + 1] - input[y][x]; // int tempDer3 = input[y+1][x] - input[y][x]; // // if (tempDer2 != tempDer3 || tempDer2 != 2 * tempDer2) { // failed = true; // break; // } // // if (tempDer1 != myDer) { // failed = true; // break; // } // } // for (s = 0; s < size - 1; r++) { // int x = j + r; // int y = i + size - 2; // if (x + 1 >= n || y + 1 >= m) { // failed = true; // break; // } // // int tempDer1 = input[y + 1][x + 1] - input[y][x]; // int tempDer2 = input[y][x + 1] - input[y][x]; // int tempDer3 = input[y+1][x] - input[y][x]; // // if (tempDer2 != tempDer3 || tempDer2 != 2 * tempDer2) { // failed = true; // break; // } // // if (tempDer1 != myDer) { // failed = true; // break; // } // } // // // if (failed) { // break; // } // // size++; // } // // int side = size - 1; // if (side > bestSide) { // bestSide = side; // } // } // } printf("%i\n", bestSide * bestSide); } }