
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;}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月13日 13时29分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
面试别慌!阿里专家带你从【入门+基础+进阶+项目】攻破SpringBoot
2019-03-03
【Java面试】30个 Java 集合面试必备的问题和答案
2019-03-03
华为鸿蒙到底是不是安卓系统套了个壳?
2019-03-03
window程序设计(1):第一个windows程序
2019-03-03
21.2.3总结
2019-03-03
方法的绑定机制-静态绑定和动态绑定
2019-03-03
Java取绝对值
2019-03-03
编写测试用例的实用小技巧
2019-03-03
c语言贪吃蛇控制台版
2019-03-03
【树形dp】P1273 有线电视网
2019-03-03
【最短路】P4408 [NOI2003]逃学的小孩
2019-03-03
2020电工(初级)考试及电工(初级)考试软件
2019-03-03
2020N1叉车司机模拟考试题库及N1叉车司机复审模拟考试
2019-03-03
2020年保育员(初级)考试资料及保育员(初级)新版试题
2019-03-03
2020年茶艺师(高级)考试内容及茶艺师(高级)考试申请表
2019-03-03
2021年重氮化工艺考试题库及重氮化工艺考试报名
2019-03-03