【发布时间】:2020-10-19 20:07:29
【问题描述】:
我使用直方图解决方案编写了这段代码,但用户不会在代码上输入矩阵,而是输入它的矩阵。现在我知道我做错了什么,除了直方图的数学之外,一切似乎都有效。我做错了什么?
用户将输入行和列,然后逐一输入矩阵中的每个值。然后代码将显示矩阵并计算所有 1 的最大大小矩形二进制子矩阵。
#include <stdio.h>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define MAXROW 100
#define MAXCOL 100
int maxHist(int row[]){
stack<int> result;
int top_val;
int max_area = 0;
int area = 0;
int a = 0;
while (a < MAXCOL)
{
if (result.empty() || row[result.top()] <= row[a])
result.push(a++);
else
{
top_val = row[result.top()];
result.pop();
area = top_val * a;
if (!result.empty())
area = top_val * (a - result.top() - 1 );
max_area = max(area, max_area);
}
}
while (!result.empty())
{
top_val = row[result.top()];
result.pop();
area = top_val * a;
if (!result.empty())
area = top_val * (a - result.top() - 1 );
max_area = max(area, max_area);
}
return max_area;
}
int maxRectangle(int A[][MAXCOL]) {
int result = maxHist(A[0]);
for (int a = 1; a < MAXROW; a++)
{
for (int b = 0; b < MAXCOL; b++)
if (A[a][b]) A[a][b] += A[a - 1][b];
result = max(result, maxHist(A[a]));
}
return result;
}
int main(){
int matrix[MAXROW][MAXCOL];
int i,j,x,y
;
cout << "Numero de linhas na matrix: ";
cin >> i;
cout << "Numero de colunas na matrix: ";
cin >> j;
float l[i][j];
int p = 0, q = 0;
while (p < i) {
while (q < j) {
cout << "Entre o valor [" << p + 1 << "," << q + 1 << "] da matrix: ";
cin >> l[p][q];
q = q + 1;
}
p = p + 1;
q = 0;
}
int A[][MAXCOL] = { l[p][q]};
cout << "\nA matrix e:\n ";
for(x=0;x< i;x++){
for(y=0;y< j;y++){
cout << l[x][y]<< " ";
}
cout << "\n";
}
cout << "Area of maximum rectangle is "
<< maxRectangle(A);
return 0;
}
【问题讨论】:
-
代码有什么问题?输出是什么,预期输出是什么?
-
float l[i][j];-- 这不是合法的 C++。 -
在代码中没有任何 cmets,并且只有对您想要实现的目标的模糊描述,因此很难就您可能出错的地方提供任何有用的反馈。我确实想知道您是否真的打算在
maxRectangle函数中修改您的“矩阵”,这会使每一行成为其上方每一行的累积总和。 -
小心
#include <bits/stdc++.h>。 bits 文件夹中的内容不打算直接包含在内,也不提供任何保证。