可以用(int)(Math.random*10
% 2)来获取0 1 随机数矩阵,求最大子方阵采用暴力求解的方式,k为最大subMatrix的维数,i,
j为它的位置,子方阵就是k维,相当于拿一个k x k的方框在
n x n的方框中去试探,看有无全为 1 的k x k方框,若有,则已经找到,就停止继续寻找。当然, 依照这个思路那 k就应该从 n开始若没找到则k–, 再从新开始找……
package Experiment2;
import java.util.Scanner;
public class Max_SubMatrix {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入矩阵的阶数n :");
int n = input.nextInt();
int[][] a = new int[n][n];
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++) {
a[i][j] = ((int)(10 *
Math.random())) % 2;
// 用对 2 取余来获取随机数 0 和 1
}
}
System.out.println("随机生成的0 1 矩阵如下:");
for(int i = 0; i < n; i++){
for (int j = 0; j < n; j++) {
System.out.print(a[i][j] +
" ");
}
System.out.println();
}
int[] result = new int[3];
result = findLargestBlock(a);
System.out.print("最大子方阵位于:");
System.out.println("(" + result[0] + "," + result[1]
+ ")" + " 阶数为:" + result[2]);
}
public static int[] findLargestBlock(int[][] m) {
int[] answer = new int[3];
int i, j, k, x, y, sign;
i = j = k = x = y = 0;
sign = 1;
int n = m.length;
for(i = 0; i < 3; i++) {
answer[i] = 0;
}
for (k = n; k >= 1; k--) {
for (i = 0; i <= n - k; i++) {
for (j = 0; j <= n - k; j++)
{
sign = 1;
for (x = i; x < i + k;
x++) {
for (y = j; y < j +
k; y++) {
if (m[x][y] != 1) {
sign = 0;
break;
}
}
if(sign == 0)
break;
}
if (sign == 1)
break;
}
if(sign == 1)
break;
}
if(sign == 1)
break;
}
answer[0] = i;
answer[1] = j;
answer[2] = k;//子方针的维数
return answer;
}
}