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.
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;
}