算法题:护林员盖房子(C++)

准备机试时发现有的学校不能用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;
}

猜你喜欢

转载自blog.csdn.net/fun_always/article/details/90046968
今日推荐