public class Main {
private static int maximalDiagnoal(int[][] matrix){
if(matrix == null || matrix.length == 0) return 0;
int rows = matrix.length;
int cols = matrix[0].length;
int[][] leftLen = new int[rows][cols];
int[][] upLen = new int[rows][cols];
int max = 0;
for(int i = 0; i < cols; i++){
if(matrix[0][i] == 0) upLen[0][i] = 1;
max = Math.max(max, matrix[0][i]);
}
for(int i = 0; i < rows; i++){
if(matrix[i][0] == 0) leftLen[i][0] = 1;
max = Math.max(max, matrix[i][0]);
}
for(int i = 1; i < rows; i++){
for(int j = 1; j < cols; j++){
if(matrix[i][j] == 0){
leftLen[i][j] = leftLen[i][j-1] + 1;
upLen[i][j] = upLen[i-1][j] + 1;
}
max = Math.max(max, matrix[i][j]);
// By default 0
}
}
int[][] dp = new int[2][cols];
for(int i = 0; i < cols; i++){
dp[0][i] = matrix[0][i];
}
for(int i = 1; i < rows; i++){
dp[i % 2][0] = matrix[i][0];
for(int j = 1; j < cols; j++){
if(matrix[i][j] == 1){
int diag = dp[(i-1) % 2][j-1];
int left = leftLen[i][j-1];
int up = upLen[i-1][j];
int min = Math.min(diag, Math.min(left, up));
dp[i % 2][j] = min + 1;
if(min + 1 > max){
max = min + 1;
System.out.println("Row : " + i + " Col : " + j);
System.out.println("Current Max : " + (min + 1));
}
}
}
}
return max;
}
public static void main(String[] args){
int[][] matrix1 = {{0,1,1,0,0,1},
{1,0,0,1,0,1},
{0,1,1,0,0,1},
{1,1,0,1,0,1},
{1,0,0,0,1,0}};
int[][] matrix2 = {{1,0,0,0,0,1},
{0,1,0,0,0,1},
{0,0,1,0,0,1},
{0,0,0,1,0,1},
{0,0,0,0,1,0}};
int[][] matrix3 = {{1,0,0,0,0,1},
{0,1,0,0,0,1},
{0,0,1,0,0,1},
{0,0,0,1,0,1},
{0,0,1,0,1,0}};
testRun(matrix1);
testRun(matrix2);
testRun(matrix3);
}
private static void testRun(int[][] matrix){
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println("Max square with 1's only at diagnal : " + maximalDiagnoal(matrix));
}
}