题目描述

给出一个n×nn \\times nn×n的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量。

输入输出格式

输入格式:

第一行,一个整数nnn,表示矩形的大小。

接下来nnn行,每行nnn个字符,这些字符为“WWW”或“BBB”。其中“WWW”表示白格,“BBB”表示黑格。

输出格式:

一个正整数,为白色矩形数量

输入输出样例

输入样例#1:

4
WWBW
BBWB
WBWW
WBWB

输出样例#1: 复制

15

说明

对于30%30\\%30%的数据,n50n ≤ 50n50

对于100%100\\%100%的数据,n150n ≤ 150n150


洛谷上这个题其实是可以n4n^4n4过的,直接枚举就行,这里讲一下n3n^3n3做法。

首先处理一下每行的高度,就是hhh数组,然后循环判断连续个数,累加即可。

//参考_Atyou大神代码
#include<iostream>
#include<cstdio>
#include<ctype.h>
using namespace std;
inline int read(){
    int x=0,f=0;char ch=getchar();
    while(!isdigit(ch))f|=ch==\'-\',ch=getchar();
    while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
    return f?-x:x;
}
char c[157][157];
int n,h[157],ans;
int main() {
	int n=read();
    for(int i=1;i<=n;i++)scanf(\"%s\",c[i]+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)//扫一遍
            if(c[i][j]!=\'B\')h[j]++;//判断每行连续的白色个数
            else h[j]=0;//因为只统计白色高度,所以如果遇到黑色就清零
        for(int j=1;j<=n;++j){
        	int high=h[j];  
            for(int k=j;k<=n;++k){
                if(!h[k])break;
                high=min(high,h[k]);//连续个数取min
                ans+=high;//矩形个数=连续个数
            }
        }
    }
    printf(\"%d\\n\",ans);
    return 0;
}
又:考试考到这个题的强化版,n2000n≤2000n2000,留坑待填。
收藏 打印