码迷,mamicode.com
首页 > 其他好文 > 详细

Scau 10327 Biggest Square

时间:2015-12-24 10:40:48      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

 

Description

You are given a M*M cloth with some holes on it. Your task is to find a biggest square cloth from it. The following is an example(M=5)
技术分享




输入格式

The first line contains the one integer number M (1<= M<=1,000). Then M lines are following. Each line contains M 
charactors which “.” means cloth and “H” means hole.



输出格式

The only line of the output contains area of the biggest square cloth mentioned above.



 

输入样例

5
H...H
.....
.....
.HHH.
.....



 

输出样例

9



 

作者

 admin

思路:比较经典的模型了,大白上有几乎一样的原题

技术分享
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
char Map[N][N];
int Up[N][N], Left[N][N], Right[N][N];
int n;
void getL() {
    for(int i = 1; i <= n; ++i) {
        int lo = 0;
        for(int j = 1; j <= n; ++j) {
           if(Map[i][j] == .) {
                Up[i][j] = Up[i - 1][j] + 1;
                Left[i][j] = max(Left[i - 1][j], lo + 1);
           }else {
                Up[i][j] = Left[i][j] = 0;
                lo = j;
           }
        }
    }
}
int ans = 0;
void getR() {
    for(int i = 1; i <= n; ++i) {
        int ro = n + 1;
        for(int j = n; j >= 1; --j) {
            if(Map[i][j] == .) {
                Right[i][j] = min(Right[i - 1][j], ro - 1);
            }else {
                Right[i][j] = n;
                ro = j;
            }
            ans = max(ans, min(Up[i][j], Right[i][j] - Left[i][j] + 1));
        }
    }
}
void show(int a[][N]) {
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) printf("%d ", a[i][j]);
        puts("");
    }
}
int main() {
    while(~scanf("%d", &n)) {
        for(int i = 1; i <= n; ++i) scanf("%s", Map[i] + 1);
        for(int i = 0; i <= n; ++i) Up[0][i] = 0;
        for(int i = 0; i <= n; ++i) Left[0][i] = 0;
        for(int i = 0; i <= n; ++i) Right[0][i] = n;
        getL();
        getR();
        printf("%d\n", ans * ans);
    }
    return 0;
}
/*
5
HH.HH
.....
.....
H...H
HHHHH
*/
View Code

 

Scau 10327 Biggest Square

标签:

原文地址:http://www.cnblogs.com/orchidzjl/p/5072181.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!