鉴于由数字0-9组成的二维矩阵,我如何找到从一个数字构造的最大正方形?
例如,
12039487067
81111012389
01111111769
71181231987
11111891167
86171231222
17130471282
37111111222
47061902547
有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坐标处考虑以下情况:
所有这些都使用顶部矩阵取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;
}