COJ - 1002 - New House 题解

本文介绍了一种使用二维动态规划解决寻找网格中最大空地面积的方法,并详细解释了算法的具体实现过程,最后通过示例展示了算法的有效性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Johan wants to build a new house and he wants his house as large as it can.
Given anN x Ngrid land, find the largest square size that fit in the free area.

Input specification

The first line of input contains an integerT (1 <= T <= 100), the number of test cases follow. Each test case starts with an integerNdenoting the size of the grid land. The nextNlines each containsNcharacters. Each character be either '.' (free area) or '#' (obstacle). Your house should be build on free area.

Output specification

For each test case, output in a line the size of the largest square on free area.

Sample input
2
10
..........
.#####....
..#..###..
...##.....
...#..#...
...#...###
....######
..........
##########
#########.
5
##..#
....#
.#..#
####.
.#..#
Sample output
3
2

大意:

1 .代表空地, #代表障碍

2 找出最大空地的面积

3 输出其边长


我这里使用的是二维动态规划法了,时间效率就是O(n^3)了。运行起来速度还挺快的30ms。

主要思想:

1 第一行和第一列都要初始化, 遇到#填写0,遇到.表示空地填1

2 之后每个格[i][j]定位,检测[i-1][j-1]格是否可以和当前格构成正方形,然后检测其两边是否为空地,两边最小的空地和[i-1][j-1]指示有的空地就构成一个包括格[i][j]在内的正方形了。这个检测需要O(n)时间,和所有格O(n^)乘起来就是O(n^3)时间效率了

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

void NewHouse()
{
	int T = 0, n = 0;
	cin>>T;
	while (T--)
	{
		cin>>n;
		vector<string> area(n);
		for (int i = 0; i < n; i++)
		{
			cin>>area[i];
		}
		for (int i = 0; i < n; i++)
		{
			if ('.' == area[0][i]) area[0][i] = '1';
			else area[0][i] = '0';
		}		
		for (int i = 1; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if ('.' == area[i][j])
				{
					if (0 == j) 
					{
						area[i][j] = '1'; 
						continue;
					}
					int m = area[i-1][j-1] - '0';
					int d = 1;
					for ( ; d <= m; d++)
					{
						if ('0' == area[i][j-d]) break;
						if ('0' == area[i-d][j]) break;
					}
					area[i][j] = d + '0';
				}
				else area[i][j] = '0';
			}
		}
		int max_area = 0;
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				max_area = max(max_area, area[i][j] - '0');
			}
		}
		cout<<max_area<<endl;
	}
}

int main()
{
	NewHouse();
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值