最大子方阵

在这里插入图片描述

可以用(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;

 

    }

 

}


在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值