Java實驗(5) 最大子方陣

給定一個由0,1組成的n*n方陣(n在運行時提醒用戶輸入),判斷其中由全1組成的最大子方陣的左上角位置和階數。例如用戶輸入n爲5,隨機產生的方陣如下:


程序的輸出爲:最大子方陣位於(2,2),階數3。

要求編寫方法實現上述功能,返回值是一個包含3個元素的數組,依次表示行下標,列下標,階數。

方法原型:public static int[] findLargestBlock(int[][] m)

                                             

package maxsubmatrix;
import java.util.Scanner;
public class MaxSubMatrix {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("請輸入方陣維數n:");
        int n=input.nextInt();
        int [][] m=new int[n][n];
        int []a=new int[3];
        //產生一個n*n矩陣,元素爲0或1並輸出
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                m[i][j]=(int)(Math.random()*10)%2;      
                System.out.print(m[i][j]+"\t");
            }
            System.out.print("\n");
        }
        a=findLargestBlock(m);
        System.out.print("\n");
        System.out.println("最大子方陣位於:("+a[0]+","+a[1]+")");
        System.out.println("階數:"+a[2]);
    }
    //找到最大的全爲1的矩陣塊
    public  static int[] findLargestBlock(int [][] m){
        boolean t=true;
        int []a=new int[3];
        int n=m.length;
        int i=0,j=0,l=0;
        for(l=n;l>=1;l--){ //矩陣維數,從最大開始
            for(i=0;i<=n-l;i++){
                for(j=0;j<=n-l;j++){
                    t=true;
                    for(int x=i;x<i+l;x++){
                        for(int y=j;y<j+l;y++){
                            if(m[x][y]!=1){    //不爲1退出此輪循環
                                t=false;
                                break;
                            }
                        }
                        if(t==false) break;
                    }
                    if(t==true) break;
                }
                if(t==true) break;
            }
            if(t==true) break;
        }
        a[0]=i;
        a[1]=j;
        a[2]=l;
        return a;
    } 
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章