找到最大的矩形尺寸

时间:2016-03-03 08:44:35

标签: algorithm language-agnostic

给定一个'O'和'X'矩阵,找到边长为'X'的最大矩形

示例1

XXXXX
X0X0X
XXXXX
XXXXX

输出:最大矩形尺寸为4 x 5

示例2

0X0XX
X0X0X
XXXXX
XXXXX

输出:最大矩形大小为2 x 5(矩阵的最后两行)

我能够制作o( n 4 )算法,其中我查找每个组合。任何人都可以给出更好的优化算法的一些提示或想法。

我的代码:

#include<iostream>
#include<vector>

using namespace std;

int arr[1001][1001];
int check(int left[][1001],int up[][1001], int m, int n, int leftx, int lefty, int rightx, int righty)
{
    if(((righty - lefty) == (left[rightx][righty] - left[rightx][lefty])) and ((left[leftx][righty] - left[leftx][lefty]) ==( righty - lefty)))
    {
        if(((rightx - leftx) == ( up[rightx][righty] - up[leftx][righty] )) and ((up[rightx][lefty] - up[leftx][lefty]) == rightx - leftx))
        {
            return (2*(left[leftx][righty] - left[leftx][lefty]   +   up[rightx][lefty]  - up[leftx][lefty] ));
        }
    }
    return 0;
}


void solve(int arr[][1001], int m, int n)
{
    int left[1001][1001];
    int up[1001][1001];
    for(int i=0 ; i<m ;i++)
    {
        int prev = 1;
        for(int j=0 ; j<n ;j++)
        {
            if(arr[i][j] == 1)
            {
                left[i][j] = prev;
                ++prev;
            }
            else if(arr[i][j] == -1)
            {
                left[i][j] = -1;
                prev =1;
            }
        }
    }

    for(int i=0 ; i<n ;i++)
    {
        int prev = 1;
        for(int j=0 ; j<m ;j++)
        {
            if(arr[j][i] == 1)
            {
                up[j][i] = prev;
                ++prev;
            }
            else if(arr[j][i] == -1)
            {
                up[j][i] = -1;
                prev =1;
            }
        }
    }


    int max = 0;
    int max_col = 0;
    int max_row = 0;
    for(int i =0; i < m-1 ; i++)
    {
        for(int j =0; j<n-1; j++)
        {

            for(int k = m-1 ; k >i ; k--)
            {
                for(int l = n-1; l >j ; l--)
                {
                    if(((k-i > max_row) || (l-j > max_col)))
                    {   
                        int maxi = check(left,up,m,n,i,j,k,l);
                        if(maxi > max)
                        {
                            max = maxi;
                            max_col = l-j;
                            max_row = k-i;
                        }
                    }
                }
            }
        }
    }
    cout<<"Dimension = "<<max_col<<"\t"<<max_row<<endl;
}

0 个答案:

没有答案