华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;

来源:互联网 发布:东莞淘宝运营商 编辑:程序博客网 时间:2024/05/01 12:05

借鉴博客 :http://www.bkjia.com/Androidjc/1019264.html

此问题主要是求一个数组的最大连续相同字符的正方形的问题,比如

0  1  1  1  1  1 

0  1  1  1  1  1 

1  1  1  1  1  1

0  0  0  0  0  0

得出来得的是

输出边长也就是3;

具体思路:

先从a[1][1]开始,循环至结尾,每一次都执行以下循环体:

比较a[]i-1[j-1],a[i][j-1],a[i-1][j],选出最小的,然后加到a[i][j]里,判断全局变量的max是否小于a[i][j],如果是的话,赋值。

代码如下:

/*
 * 给你一个N*M的矩阵,每个位置的值是0或1,
 * 求一个面积最大的子矩阵,这个矩阵必须是一个正方形,
 * 且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
 * */


import java.util.*;
public class juzhen{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int m,n;

while(true){
m=sc.nextInt();
n=sc.nextInt();
int[][] a=new int[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
a[i][j]=sc.nextInt();
/*测试输出刚才输入的内容
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
System.out.print(a[i][j]+" ");
System.out.println();
}*/

//通过cout函数求得最大边长
int s=cout(a,m,n);
System.out.println(s);
}


}

//求最大边长的函数
private static int cout(int[][] a, int m, int n) {
// TODO Auto-generated method stub
int max=-1;
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(a[i][j]==1){
int min=a[i-1][j-1];
if(a[i-1][j]<min)
min=a[i-1][j];
if(a[i][j-1]<min)
min=a[i][j-1];
a[i][j]+=min;
if(max<a[i][j])
max=a[i][j];
}
}
return max;
}
}


0 0
原创粉丝点击