洛谷 P1191 矩形 题解

P1191 矩形

题目描述

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

输入格式

第一行,一个整数\(n\),表示矩形的大小。

接下来\(n\)行,每行\(n\)个字符,这些字符为“\(W\)”或“\(B\)”。其中“\(W\)”表示白格,“\(B\)”表示黑格。

输出格式

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

输入输出样例

输入 #1

4
WWBW
BBWB
WBWW
WBWB

输出 #1

15

说明/提示

对于\(30\%\)的数据,\(n ≤ 50\)

对于\(100\%\)的数据,\(n ≤ 150\)

【思路】

暴力?
输入数据,
同时记录没一点从他开始到上面一共有多少个连续的白点
然后再枚举一遍矩阵
每一个点都求出附近能够组成的矩阵的数量
累加起来
怎么求能够成矩阵的数量呢?
枚举这个矩阵的长
然后宽是长覆盖的范围里面最矮的那个
用长*宽就是目前矩阵的长能够包含的矩阵的数量
输出和就好了

【完整代码】

#include<iostream>
#include<cstdio>

using namespace std;
const int Max = 1005;
int f[Max][Max];
int main()
{
	char c;
	int n;
	cin >> n;
	for(register int i = 1;i <= n;++ i)
	{
		for(register int j = 1;j <= n;++ j)
		{
			cin >> c;
			if(c == 'B')f[i][j] = 0;
			else
			f[i][j] = f[i - 1][j] + 1;
		}
	}
	int ans = 0;
	for(register int i = 1;i <= n;++ i)
	{
		for(register int j = 1;j <= n;++ j)
		{
			int M = f[i][j];
			for(register int l = j,r = j;l >= 1,r <= n;++ l,++ r)
			{
				M = min(M,min(f[i][l],f[i][r]));
				ans += (r - l + 1) * M;
			}
		}
	}
	cout << ans << endl;
	return 0;
} 
posted @ 2019-10-10 20:29  acioi  阅读(384)  评论(0编辑  收藏  举报