【蓝桥杯】找出边界为1的最大子方阵

题目说明:

给定一个N*N的矩阵matrix,在这个矩阵里,只有0和1的两种值,返回边框全是1的最大正方形的边长长度。

示例:

1 1 1 1
1 0 1 0
1 1 1 1
0 1 0 1

输出 :3

因为

1 1 1  
1   1  
1 1 1  
       

分析:(枚举,遍历所有可能性)

1.最大正方形,一定是从N向下递减。这就要用循环(比如说5->4->3->2->1)

2.遍历数组,判断以该点为顶点能否构成1为边界的方阵。所以就设计到检测四个边框,也要用到循环。

 1 public class CopyOfcase4 {
 2 
 3     public static void main(String[] args) {
 4 
 5         int arr[][] = { 
 6                 { 1, 1, 1, 1,1 }, 
 7                 { 1, 0, 1, 0,1 }, 
 8                 { 1, 1, 0, 1,1 }, 
 9                 { 1, 0, 1, 1,1 }, 
10                 { 1, 1, 1, 1,1 }, 
11                 };
12         System.out.println(max(arr, arr.length));
13 
14     }
15 
16     static int max(int[][] matrix, int N) {
17 
18         int n = N;// 因为N变化,所以赋值给变量
19         while (n > 0) {// 5->4->3->2->1
20             for (int i = 0; i < N; i++) {
21                 if (i + n > N)
22                     break;// 如果行超过N最大边界就要退出
23                 l3: for (int j = 0; j < N; j++) {
24                     if (j + n > N)
25                         break;// 如果列超过N最大边界就要退出
26                     int r = i, c = j;
27                     // 检测四条边是否都为1;
28                     while (c < j+n) {// 上边,行不变,列增加
29                         // 如果改顶点为0,一定构不成全为1的边,继续该行下一点的判断
30                         if (matrix[r][c++] == 0)
31                             continue l3;
32                     }
33                     // 当退出while循环时,c已经超数组边界,所以要恢复
34                     c--;
35                     while (r < i+n) {// 右边,列不变,行增加
36                         if (matrix[r++][c] == 0)
37                             continue l3;
38                     }
39                     r--;
40                     while (c >= j) {// 下边,行不变,列递减
41                         if (matrix[r][c--] == 0)
42                             continue l3;
43                     }
44                     c++;
45                     while (r >= i) {// 左边,列不变,行递增
46                         if (matrix[r--][c] == 0)
47                             continue l3;
48                     }
49                     return n;
50                 }
51             }
52             n--;
53 
54         }
55         return 0;
56     }
57 }

上述代码输出 5。

下一篇将退出优化代码,因为现在的时间复杂度是N*N*N*N,只有最后一个N可以优化,检测四条边的while可不可以换成常数阶?

如有错误,望各位园友批评指正,大家一起进步呀。

猜你喜欢

转载自www.cnblogs.com/dfglind/p/13384734.html