准备机试时发现有的学校不能用java,为保险只好把C++再翻出来。后来又发现有的学校不能用VS?只能再把Dev C++翻出来。
————————————————————————————————————————————
题目:护林员盖房子
描述
在一片保护林中,护林员想要盖一座房子来居住,但他不能砍伐任何树木。
现在请你帮他计算:保护林中所能用来盖房子的矩形空地的最大面积。
输入
保护林用一个二维矩阵来表示,长宽都不超过20(即<=20)。
第一行是两个正整数m,n,表示矩阵有m行n列。
然后是m行,每行n个整数,用1代表树木,用0表示空地。
输出
一个正整数,表示保护林中能用来盖房子的最大矩形空地面积。
样例输入
4 5 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1
样例输出
5
提示
子矩阵边长可以为1,也就是说:
0 0 0 0 0
依然是一个可以盖房子的子矩阵。
————————————————————————————————————————————
思路:就是求一个矩阵中的最大子矩阵,遍历两次即可。第一次:求出每个位置的最大连续区间;第二次:求出每个点向上的最大矩阵面积。要点:矩阵面积的求法用width*longth,width初值为1,每向上回溯一次width加一。
code:
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main() {
int m;
int n;
int map[21][21] = {0};
cin >> m >> n;
vector<vector<int> > array(m);
for (int i = 0; i<m; ++i)
{
for (int j = 0; j < n; ++j)
{
int temp;
cin >> temp;
array[i].push_back(temp);
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (array[i][j] == 0)
map[i][j] = 1;
}
}
for (int i = 0; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
if (map[i][j] != 0 && map[i][j - 1] != 0)
map[i][j] = map[i][j-1]+1;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cout<< map[i][j]<<" ";
}
cout<<endl;
}
int GG_max = 0; int width; int longth; int area;
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
if (map[i][j] != 0)
{
width = 1; longth = map[i][j]; area = width * longth; GG_max = max(GG_max,area);
for(int k = i-1;k>=0;k--){
if (map[k][j] != 0) {
width++;
longth = min(longth, map[k][j]);
GG_max = max(GG_max, width*longth);
}
}
}
}
}
cout << GG_max;
return 0;
}