Description
Johan wants to build a new house and he wants his house as large as it can.
Given an N x N grid land, find the largest square size that fit in the free area.
Given an N x N grid land, find the largest square size that fit in the free area.
Input specification
The first line of input contains an integer
T (1 <= T <= 100), the number of test cases follow. Each test case starts with an integer
N denoting the size of the grid land. The next
N lines each contains
N characters. 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;
}