找出矩阵中的最大矩形


//找出矩阵中由 1 组成的最大的矩形,
#include "stdafx.h"
#include "iostream"

using namespace std;
int find_1(int **p, int nRow, int nCol);
int find_Rect(int **p, int x, int y, int nRow, int nCol);

int main()
{
	int nRow = 0, nCol = 0;
	cin >> nRow >> nCol;

	int **p = new int*[nRow]();
	for (int n0 = 0; n0 < nRow; ++n0)
		p[n0] = new int[nCol]();


	for (int n = 0; n < nRow; ++n)
		for (int m = 0; m < nCol; ++m)
			cin >> p[n][m];

	cout << find_1(p, nRow, nCol);

    return 0;
}


int find_1(int **p,int nRow,int nCol) {
	int max = 0;

	for (int n = 0; n < nRow; ++n)
		for (int m = 0; m < nCol; ++m)
			if (p[n][m] != 0) {
				int tmp = 0;
				tmp = find_Rect(p, n, m, nRow, nCol);
				if (tmp) {
					max = tmp > max ? tmp : max;
				}
				else continue;
			}


	return max;	
}


int find_Rect(int **p, int x, int y, int nRow, int nCol) {
	int length = 0;
	for (int m0 = y; m0 < nCol; ++m0) {
		if (p[x][m0] == 1)
			length++;
		else break;
	}

	for (int m = x; m < ((x + length)>nRow?nRow:(x+length)); ++m)
		for (int n = y; n < ((y + length)>nCol?nCol:(y+length)); ++n)
			if (p[m][n] != 1) {
				int tmp = m > n ? m : n;
				length = length > tmp ? tmp : length;
			}
	if (length>(nRow - x))length = (nRow - x);

	return length;
}

方法可能比较笨拙,遍历过程可以优化,缩小遍历范围

你可能感兴趣的:(个人方案)