题目
在一个由0和1组成的二维数组里求出由1围成的最大子方阵的阶数。
例如:
{1,1,1,1}
{1,0,1,0}
{1,1,0,1}
{1,1,1,1}
中的最大子方阵就是2阶方阵。
解题思路分析
这里要注意的是求的是方阵而不是矩阵。
求最大的话,应该就是从最大的往小的求,假设一个5*6的矩阵的最大子方阵是5阶的,那么我执行一次就好了,肯定没有子阵是大于5阶的了。
思路:遍历每个点作为顶点,去遍历该范围组成的边的每一个元素是否合法,全部合法则返回当前的阶数,只要有一个不满足则继续缩小范围。
代码
// 找出边界位1的最大字方阵
public class Demo46 {
public static int getN(int[][] matrix) {
int N = matrix.length;
int n = N;
while (n > 0) {
// 遍历每一个顶点
for (int i = 0; i < N; i++) {
if ( i+n > N) break;
l3 : for (int j = 0; j < N; j++) {
if ( j+n > N) break;
// 以当前点作为顶点检查
int row = i;
int col = j;
// 检查上面的边
while (col < j + n) {
if (matrix[row][col] == 0) {
continue l3;
}
col++;
}
col--; // 注意这里
// 检查右边的边
while (row < i + n) {
if (matrix[row][col] == 0) {
continue l3;
}
row++;
}
row--;
// 检查下面的边
while (col >= j) {
if (matrix[row][col] == 0) {
continue l3;
}
col--;
}
col++;
// 检查左边的边
while (row >= i) {
if (matrix[row][col] == 0) {
continue l3;
}
row--;
}
return n;
}
}
n--;
}
return 0;
}
public static void main(String[] args) {
int[][] matrix = {
{1,1,1,1},
{1,0,1,0},
{1,1,0,1},
{1,1,1,1}
};
System.out.println(getN(matrix));
}
}
输出结果:2