Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

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

【输入格式】

输入文件rec.in第一行,仅包含一个整数n,表示矩形的大小。 接下来n行,每行n个字符,这些字符为“W”或“B”。其中“W”表示白格,“B”表示黑格。

【输出格式】

输出文件rec.out仅包括一个正整数,为白色矩形数量

【数据规模】

对于30%的数据,n ≤ 50; 对于100%的数据,n ≤ 150;

Sample Input1

4
WWBW
BBWB
WBWW
WBWB

Sample Output1

15

【题解】

这题有比较特殊的技巧。

设f[i][j]表示(i,j)这个白砖下面有连续几个白砖。

对于枚举到的白砖(i,j),令L=f[i][j];

答案累加L。

然后令k=j+1.不断往右枚举。

L=min(L,f[i][k])。如果f[i][k]==0则停止递增k.

否则答案累加L。

然后枚举所有的白砖即可。

原理如下。下面的1表示白砖。

假设当前i=1,j=1;

L=f[1][1]==3;

答案先累加L == 3;(表示3个长度为1的砖。如下图)

然后往右。答案再累加L==3(表示3个长度为2宽为1的砖);

跳过其他的点

然后i=2,j=1;

L=f[2][1];

答案先累加L==2;(第一列,竖下来,2个宽度为1,长为2的矩形);

如下图:

然后i=2,j=2;

L=min(L,f[2][1]);然后L仍然等于2;

所以答案再累加上2.(两列,竖下来,2个宽度为2,长为2的矩形如下图)

跳过其他点。

然后i=3,j=1;

L=f[3][1] == 1;

答案先累加L==1;

表示一个长为1,高为3的矩形,如下图;

然后往右i=3,j=2;

L仍然为1.答案累加L。

表示一个宽为2,高为3的矩形。

特殊的。

对于下面这种情况。

当i=2,j=1时,往右枚举时。加上L=2.表示的是下图的情况。

通过以上例子。

如果某个砖块下面还有砖。(白)

那么在对上面的砖操作之后。比如还会对下面的砖进行操作。

然后我们在对下面的砖进行操作的时候。实际上就是在枚举上面那个砖的右下角。

再往下的i-2号砖,也是一样在枚举最上面那个砖的右下角。

然后最上面那个砖作为左上角。

特殊的。认为只有一块砖的矩形是由最上面那个砖自己构成左上和右下组成的。

所以我们在枚举最上面那块砖下面的砖的时候。如果往右递增答案了。就相当于扩展了

矩形的右下角。

然后枚举的左上到右下这样的矩形个数恰

好为min(左上角下面的矩形数,右下角下面的白矩形)

这个左上角是会发生变化的。

就像上面那个图一样。

【代码】

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring> using namespace std; int n;
string s;
bool bo[151][151];
int f[151][151] = { 0 }; void input_data()
{
memset(bo, false, sizeof(bo));
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
cin >> s;
for (int j = 1; j <= n; j++) //是白色的就记录一下。
if (s[j - 1] == 'W')
bo[i][j] = true; //转换成bool型数组。
}
} int min(int x, int y) //返回x和y之间的最小值。
{
return x > y ? y : x;
} void get_ans()
{
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (bo[i][j]) //如果是白的砖
{ //则求出其(包括其)下面有多少个砖
int k = i;
while (bo[k-1][j]) k--;
f[i][j] = i - k + 1;
}
int ans = 0; //这是最后要输出的答案
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (f[i][j] > 0) //如果这个转是白砖。
{
int l = f[i][j];
ans += l; //先累加上答案。
int k = j + 1; //往右移动。
while (f[i][k] > 0) //如果还是大于0.则可以扩展右下角。
{
l = min(f[i][k], l);
ans += l; //累加相应的矩形个数即可。
k++;
}
}
printf("%d\n", ans);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
input_data();
get_ans();
//fclose(stdin);
//fclose(stdout);
return 0;
}
												

【u126】矩形的更多相关文章

  1. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  2. C语言 · 矩形面积交

    问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行,每行描述一个矩形. 在每行中 ...

  3. canvas快速绘制圆形、三角形、矩形、多边形

    想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...

  4. [LeetCode] Perfect Rectangle 完美矩形

    Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover o ...

  5. [LeetCode] Rectangle Area 矩形面积

    Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...

  6. [LeetCode] Maximal Rectangle 最大矩形

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  7. [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  8. [翻译svg教程]svg中矩形元素 rect

    svg 元素<rect> 是一个矩形元素,用这个元素,可以你可以绘制矩形,设置矩形宽高,边框的宽度颜色,矩形的填充颜色,是否用圆角等 rect 示例 <svg xmlns=" ...

  9. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

随机推荐

  1. CISP/CISA 每日一题 七

    CISA 每日一题(答) 确保只有恰当授权的出站交易才能被处理,控制目的: 1.出站交易是基于授权而被启动: 2.出站交易包含了唯一的预先授权的交易类型: 3.出站交易只能被发送到合法的商业伙伴那里. ...

  2. 洛谷 P2628 冒险岛

    P2628 冒险岛 题目背景 冒险岛是费老师新开发的一种情景模拟电脑的游戏,通过掷骰子(1~6个数字之间),让一种人物(棋子)在棋纸上从左至右的行走,从而模拟冒险的故事…… 题目描述 棋纸上有一条从左 ...

  3. 洛谷 P2562 [AHOI2002]Kitty猫基因编码

    P2562 [AHOI2002]Kitty猫基因编码 题目描述 小可可选修了基础生物基因学.教授告诉大家 Super Samuel 星球上 Kitty猫的基因的长度都是 2 的正整数次幂 ), 全是由 ...

  4. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  5. Solr 写数据流程

    Solr 写数据流程: 1.源字符串首先经过分词器处理,包括:拆分词以及去除stopword. 2.然后经过语言处理,包括大小写转换以及单词转换. 3.将源数据中需要的信息加入到Document中的各 ...

  6. 洛谷P1876 开灯

    题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编号为1的人走过来, ...

  7. JS/CSS 响应式样式实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. OpenCV func

    cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);  //CV_LOAD_IMAGE_GRAYSCALE   //0

  9. 【Educational Codeforces Round 33 C】 Rumor

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最后会形成多个集合,每个集合里面的人能够可以互相到达. 则维护并查集的时候,顺便维护一下每个集合里面的最小值就好. 最后答案就为 ...

  10. 微信小程序实现运动步数排行(可删除)

    wxml <!-- 向左滑动删除功能 --> <view class="item-box"> <view class="items" ...