找到一个由一个数字构成的最大正方形

时间:2015-03-20 07:42:04

标签: algorithm

鉴于由数字0-9组成的二维矩阵,我如何找到从一个数字构造的最大正方形?

例如,

12039487067
81111012389
01111111769
71181231987
11111891167
86171231222
17130471282
37111111222
47061902547

有3个方块:

  1. 从(1,1)开始,到(4,4)
  2. 结束
  3. 从(2,2)开始,到(7,7)结束
  4. 从(5,8)开始,到(7,10)结束
  5. 最大的广场是第二个广场。如果我必须找到一个矩形,我该怎么办呢?

    我知道找到实心方块的逻辑,但不知道它的空心。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我会选择以下内容:对于数组中的每个位置,调用一个与第一个值匹配的递归子转换(X'+ 1,Y'')和(X'',Y'+ 1)。如果其中一些不匹配开始递归(X',Y''+ 1)和(X''+ 1,Y'),直到它们再次在同一个地方相遇,你可以说你有一个正方形... < / p>

没有回溯也会处理(2,2) - &gt;(4,4)

的例子中的“怪异”情况

答案 1 :(得分:0)

首先扫描矩阵以计算剩余的辅助矩阵可能有所帮助,向上计算每个方向上连续条目的数量。

因此,例如,left [2,5]将等于3,因为元素2,5左侧有3个连续元素具有相同的值。

对于大小为n * n的矩阵,可以使用简单的动态规划在O(n ^ 2)中计算这些矩阵。

一旦你有这些矩阵,你可以通过检查角来检查O(1)时间是否有任何特定的候选矩形是有效的。

然后,这给出了立即O(n ^ 3)算法,用于找到最佳平方(简单地测试每个O(n ^ 3)个可能的平方位置),一个用于矩形的O(n ^ 4)方法。 / p>

您还可以使用O(n ^ 3)方法查找最佳矩形  通过固定矩形的顶部和底部坐标(O(n ^ 2)选项),然后遍历矩阵。然后,您需要在每个x坐标处考虑以下情况:

  1. 我们可以继续前一个矩形(如果顶部和底部的颜色与当前颜色匹配,则可能)
  2. 我们可以完成上一个矩形(如果从上到下连接当前颜色,则可能)
  3. 否则,我们可以开始一个新的矩形(如果从上到下连接有新颜色,则可能)
  4. 所有这些都使用顶部矩阵取O(1),并且有O(n)x坐标,所以总共需要O(n ^ 3)来找到最佳矩形轮廓。

答案 2 :(得分:0)

这是查找最大平方的简单解决方案。

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include<cstring>
#include <math.h>
#include<cstdio>
#include<string>
#include <queue>
#include <list>

using namespace std;

bool flag = false;
char ch[100][100];

int findMxSq(int leftX, int upY, int rightX, int downY){
    int mx = (rightX-leftX+1)*(downY-upY+1);
    bool flag = true;
    char c = ch[leftX][upY];
    for(int i=leftX; i<=rightX; i++){
        flag &= (c==ch[i][downY+1]);
    }
    if(flag) mx = max(mx, findMxSq(leftX,upY,rightX,downY+1));
    flag = true;
    for(int i=upY; i<=downY; i++){
        flag &= (c==ch[rightX+1][i]);
    }
    if(flag) mx = max(mx, findMxSq(leftX,upY,rightX+1,downY));
    return mx;
}
int main(){
    memset(ch,'*',sizeof(ch));
    for(int i=1; i<=9; i++)
        for(int j=1; j<=11; j++)
            cin>>ch[i][j];
    int ans = 0;
    for(int i=1; i<=9; i++)
        for(int j=1; j<=11; j++)
            ans = max(ans,findMxSq(i,j,i,j));
    cout<<ans<<endl;
    return 0;
}