#include <iostream> #include <stack> using namespace std; /** ** 获取以height为底的矩形的最大面积 / int GetMaxArea(int height, int length) { stack<int> s; int j = 0, k = 0; int maxArea = 0; int i = 0; while (i<length || !s.empty()) { while (!s.empty() && height[i] <= height[s.top()]) { j = s.top(); s.pop(); if (s.empty()) { k = -1; } else { k = s.top(); } maxArea = max(maxArea, (i - k - 1) * height[j]); } if (i<length) { s.push(i); i++; } } return maxArea; } /* * 获取最大子矩阵的面积大小 / int GetMaxSubMatrixArea(int data,int rows,int cols) { if (data==nullptr||rows<=0||cols<=0) { return 0; } int height = new int[cols]; for (int i = 0; i < cols; i++) { height[i] = 0; } int max = 0,area = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { height[j] = data[i * cols + j] == 0? 0 :height[j] + 1 ; } area = GetMaxArea(height, cols); if (max<area) { max = area; } } return max; } void GetMaxSubMatrixArea_Test() { int data[] = { 1,0,1,1, 1,1,1,1, 1,1,1,0 }; // 6 cout << GetMaxSubMatrixArea(data, 3, 4) << endl; int data2[] = { 1,0,1,1, 0,1,1,0, 1,1,1,1, 0,1,1,1, 1,1,1,1 }; // 9 cout << GetMaxSubMatrixArea(data2, 5, 4) << endl; int data3[] = { 1,0,0,1,0, 0,1,1,0,1, 1,1,1,1,1, 1,1,1,1,0, 0,1,1,0,0 }; // 8 cout << GetMaxSubMatrixArea(data3, 5, 5) << endl; int data4[] = { 0,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 }; // 4 cout << GetMaxSubMatrixArea(data4, 5, 5) << endl; int data5[] = { 0,1,1,1,1, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,0,0 }; // 5 cout << GetMaxSubMatrixArea(data5, 5, 5) << endl; int* data6 = nullptr; // 0 异常输入 cout << GetMaxSubMatrixArea(data6, 0, 0) << endl; } int main() { GetMaxSubMatrixArea_Test(); }改为手动输入矩阵
时间: 2023-08-22 13:09:26 浏览: 79
好的,我给你改写一下,可以手动输入矩阵:
```c++
#include <iostream>
#include <stack>
using namespace std;
/**
* 获取以height为底的矩形的最大面积
*/
int GetMaxArea(int* height, int length) {
stack<int> s;
int j = 0, k = 0;
int maxArea = 0;
int i = 0;
while (i < length || !s.empty()) {
while (!s.empty() && height[i] <= height[s.top()]) {
j = s.top();
s.pop();
if (s.empty()) {
k = -1;
} else {
k = s.top();
}
maxArea = max(maxArea, (i - k - 1) * height[j]);
}
if (i < length) {
s.push(i);
i++;
}
}
return maxArea;
}
/*
* 获取最大子矩阵的面积大小
*/
int GetMaxSubMatrixArea(int* data, int rows, int cols) {
if (data == nullptr || rows <= 0 || cols <= 0) {
return 0;
}
int* height = new int[cols];
for (int i = 0; i < cols; i++) {
height[i] = 0;
}
int max = 0, area = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cin >> data[i*cols+j]; // 手动输入矩阵
height[j] = data[i * cols + j] == 0 ? 0 : height[j] + 1;
}
area = GetMaxArea(height, cols);
if (max < area) {
max = area;
}
}
delete[] height;
return max;
}
void GetMaxSubMatrixArea_Test() {
int rows, cols;
cout << "请输入矩阵的行数和列数(用空格隔开):" << endl;
cin >> rows >> cols;
int* data = new int[rows * cols];
cout << "请输入矩阵中的元素(0代表空,1代表有方块):" << endl;
int max = GetMaxSubMatrixArea(data, rows, cols);
cout << "最大子矩阵的面积为:" << max << endl;
delete[] data;
}
int main() {
GetMaxSubMatrixArea_Test();
return 0;
}
```
你可以复制以上代码进行运行测试。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)