#include #include #include #include using namespace std; struct Smer { int x; int y; }; int R, S; int img[1002][1002]; // Obrázek s rámečkem z 0 Smer smer[4] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}}; int usek[4][1002][1002]; int main() { // Načtení vstupu scanf("%d%d", &S, &R); for (int i=1; i<=R; i++) { for (int j=1; j<=S; j++) { char c; scanf(" %c", &c); if (c=='1') img[i][j] = 1; else img[i][j] = 0; } } // Počítání délek úseků for (int i=1; i<=R; i++) { int d = 0; for (int j=1; j<=S; j++) { if (img[i][j]==1) d++; else d = 0; usek[2][i][j] = d; } } for (int i=1; i<=S; i++) { int d = 0; for (int j=1; j<=R; j++) { if (img[j][i]==1) d++; else d = 0; usek[3][j][i] = d; } } for (int i=1; i<=R; i++) { int d = 0; for (int j=S; j>0; j--) { if (img[i][j]==1) d++; else d = 0; usek[0][i][j] = d; } } for (int i=1; i<=S; i++) { int d = 0; for (int j=R; j>0; j--) { if (img[j][i]==1) d++; else d = 0; usek[1][j][i] = d; } } // Testování políček int ret = INT_MAX; for (int i=1; i<=R; i++) { for (int j=1; j<=S; j++) { if (img[i][j]==1) { int s = -1; // Je v nějakém směru 0? for (int k=0; k<4; k++) { if (img[i-smer[k].y][j-smer[k].x]==0) { s = k; break; } } // Ano, je. if (s>=0) { int y = i; int x = j; int k = 1; int h = INT_MAX/3; int d = INT_MAX/3; // Vydej se jedním směrem dokud zvětšujeme čtverec while (img[y][x]==1 && h+d-1>=k) { h = usek[(s+1)%4][y][x]; d = usek[(s+3)%4][y][x]; k++; y += smer[s].y; x += smer[s].x; } // Našli jsme čtverec velký k-1 ret = min(ret, k-1); } } } } printf("%d\n", ret); return 0; }