概述
题目链接
题意
给一个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 <bits/stdc++.h>
#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 1181C-Flag【预处理】【暴力】的全部内容,希望文章能够帮你解决Codeforces 1181C-Flag【预处理】【暴力】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复