zoukankan      html  css  js  c++  java
  • Scau 10327 Biggest Square

    时间限制: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
    ", ans * ans);
        }
        return 0;
    }
    /*
    5
    HH.HH
    .....
    .....
    H...H
    HHHHH
    */
    View Code
  • 相关阅读:
    testNG 注解使用说明
    jenkins 生成HTML报表,邮件推送
    Jenkins 邮件发送
    Jenkins+SVN+Maven+testNG管理项目
    SVN 安装教程
    大数据笔记(十一)——倒排索引
    大数据笔记(十)——Shuffle与MapReduce编程案例(A)
    大数据笔记(九)——Mapreduce的高级特性(B)
    大数据笔记(八)——Mapreduce的高级特性(A)
    大数据笔记(七)——Mapreduce程序的开发
  • 原文地址:https://www.cnblogs.com/orchidzjl/p/5072181.html
Copyright © 2011-2022 走看看