Codeforces 1181C-Flag【预处理】【暴力】
发布日期:2021-05-04 18:31:16 浏览次数:25 分类:技术文章

本文共 1987 字,大约阅读时间需要 6 分钟。

题意

给一个n * m的网格图,每一个格子有一种颜色(由a~z表示颜色),如果图中有一个子区域是如下图所示,就称作flag,flag的条件:

1,由三层组成,中间层的颜色和上下两层的颜色不同
2,这三层,每层所占行数一样
3,flag的宽度至少是1
问你该图中最多可以组合出几个flag
在这里插入图片描述

思路

mapp[i][j]表示在原图中 i,j 处的颜色

block[i][j] 表示在 i,j 处向下延伸和 mapp[i][j] 相同颜色的最长的长度
先对每一个位置 r, c 进行预处理出block,

然后就是遍历每个点,把该点作为flag的中间层,判断他能不能组合出一个宽为1的flag;如果可以,求 i,j+1 这个位置能不能组合出一个和 i,j 一样的flag,如果可以则宽加一,不可以就接着遍历下一个点(满足条件时就不需要再对,[i][j+1] 遍历了)。

求出宽度后,(w*(w+1)/2) 就是这个区域可以组合出的最大的flag数量了

代码

#include 
#define maxn 1010 using namespace std;typedef long long ll;char mapp[maxn][maxn];struct node{ char color; int len;}block[maxn][maxn];int n, m;//n行, m列 void init(){ for(int j = 1; j <= m; j++){ for(int i = 1; i <= n; i++){ int r = i, c = j, len = 1; while(i <= n && mapp[i][j] == mapp[i+1][j]){ i++; len++; } for(int p = r; p <= i; p++){ block[p][j].color = mapp[r][c]; block[p][j].len = len--; } } }}bool judge(int r, int c){ //判断是不是flag int len = block[r][c].len; if(r-len >= 1 && r+len <= n && block[r-len][c].len == len && block[r+len][c].len >= len && block[r][c].color != block[r-len][c].color && block[r][c].color != block[r+len][c].color){ return true; } return false;}int juadeSame(int r, int c, int len){ //判断r,c这个位置的flag和r,c+1的flag是否一样 if(block[r][c+1].len == len && judge(r, c+1)){ if(block[r][c].color == block[r][c+1].color && block[r-len][c].color == block[r-len][c+1].color && block[r+len][c].color == block[r+len][c+1].color){ return true; } } return false;}int calWidth(int r, int &c){ //计算宽最大多大 int len = block[r][c].len; int w = 1; while(c <= m && juadeSame(r, c, len)){ w++; c++; } return w;}int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ scanf("%s", &mapp[i][1]); } init(); if(n <= 2){ cout << 0 << endl; return 0; } ll ans = 0; for(int i = 2; i < n; i++){ for(int j = 1; j <= m; j++){ if(judge(i, j)){ //如果是一个flag,计算它的宽最大多大 int w = calWidth(i, j); ans += (w * (w + 1LL) / 2LL); } } } cout << ans << endl;}
上一篇:Codeforces 1185C2-Exam in BerSU (hard version)【思维】【桶排】
下一篇:BNUOJ 萌萌哒身高差【规律】【水题】

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月13日 13时29分51秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章