請設計一個高效算法,找到四條邊顏色相同的最大子方陣。

有一個方陣,其中每一個單元(像素)非黑即白(非0即1),請設計一個高效算法,找到四條邊顏色相同的最大子方陣。算法

給定一個01方陣mat,同時給定方陣的邊長n,請返回最大子方陣的邊長。保證方陣邊長小於等於100。數組

測試樣例:dom

[[1,1,1],[1,0,1],[1,1,1]],3
返回:3

 


  int maxSubMatrix(vector<vector<int> > mat, int n)   
    {  
        // write code here  
        //選定最大子方陣的邊長,選擇頂點,判斷是合法  
        int maxlength=n;  
        while(maxlength)  //選擇邊長  
        {  
            for(int i=0;i<=n-maxlength;i++)  
            {  
                for(int j=0;j<=n-maxlength;j++)  
                {  
                    //當前頂點爲[i,j];  
                    int key=mat[i][j];  
                    //判斷是否合法  
                    bool flag=true;  
                    for(int k=0;k<maxlength;k++)  
                    {  
                        int k1=mat[i][j+k];  
                        int k2=mat[i+maxlength-1][j+k];  
                        int k3=mat[i+k][j];  
                        int k4=mat[i+k][j+maxlength-1];  
                        if(k1!=key||k2!=key||k3!=key||k4!=key)  
                        {  
                            flag=false;  
                            break;  
                        }  
                    }  
                    if(flag)  
                        return maxlength;  
                }  
            }  
            maxlength--;  
        }  
        return 0;  
    }測試

 

擴展:spa

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

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

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

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

                                             

 

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--){ //矩陣維數,從最大開始 input

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;       }    } 

相關文章
相關標籤/搜索