2014新生暑假个人排位赛01 D. BLOCKS

本文介绍了一个算法问题,旨在计算给定矩阵中由'#'字符形成的矩形数量。通过扫描矩阵检查矩形的连通性和完整性,并提供了一种有效的方法来统计独立矩形的数量。
时间限制 1000 ms内存限制65536 KB

题目描述

给定一个NM的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"

输入格式

1n,m1000

有多组数据,EOF结束。

输出格式

每行对应一个answer

输入样例

6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#

输出样例

There are 5 ships.
So Sad

先扫一遍看有没有不联通的矩形,很简单,就是“缺角”的矩形

接下来,枚举#的点,看其上方和左边是不是.即可,这样的#的数量即为ans
#include <cstdio>
#include <iostream>
#include <cstring>
#define N 1005

using namespace std;

char a[N][N];
int n,m,ans;
int flag;
int judge(){
    int i=2,j=2,p,q;
    for(;i<=n;i++)
        for(;j<=m;j++){
            int tmp=0;
            for(p=i-1;p<=i;p++)
                for(q=j-1;q<=j;q++)
                    if(a[p][q]=='.')tmp++;
            if(tmp==1) return 0;
        }
    return 1;
}
int main(){
    int i,j;
    while(~scanf("%d%d",&n,&m)){
        for(i=1;i<=n;i++) scanf("%s",a[i]);
        for(i=1;i<=n;i++)
            for(j=m;j>=1;j--)
                a[i][j]=a[i][j-1];
        for(i=0;i<=max(m,n);i++) {a[0][i]='.';a[i][0]='.';}

        if(!judge()) printf("So Sad\n");
        else{
            ans=0;
            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                    if(a[i][j]=='#' && a[i][j-1]=='.' && a[i-1][j]=='.') ans++;
            printf("There are %d ships.\n",ans);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值