Description:

定义一个星星由 '*' 组成,形状为一个对称的“十”字型,大小为星星 1/2 的横长(或纵长)减一(如题目中的图)。给出一个 n*m 的图,判断是不是每一个 '*' 都能属于某个星星,如果能则输出所有星星的位置及大小(各个星星间可以出现重叠甚至重合),否则输出-1.

Solution:

f[i][j][k] 代表在当前位置 (i, j) 在 k 方向有多少个连续的星号 '*'(1代表上,2代表下,3代表左,4代表右)。

枚举每一个星号(i, j),每一个星号上取 f[i][j][k](1 <= k <= 4) 中的最小值min,代表已当前位置为中心可形成的最大星星,当min > 1时代表当前星星合法。用vector记录下答案,扫一遍就可以找到所有星星。

同时用两个数组 presum_x 与 presum_y 表示当前星星的覆盖值,如果当前星星的位置为(i, j),大小为 d,那么将当前星星横向的左端点加一(presum_x[i-d+1][j]++),右端点加一的位置上减一(presum[i+d][j]--);同理,星星纵向的上端点加一(presum_y[i][j-d+1]++),下端点加一的位置上减一(presum_y[i][j+d]--)。

然后分别对这两个数组求横向和纵向的和,可以得出,所有找到的答案中的星星的覆盖值都大于0(妙啊)。所以,再进行一次扫描,如果当前位置为星号,且纵向和横向的覆盖值都为0,说明当前图中的所有星号不能被完全覆盖,输出-1,否则输出vector中记录下的答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int Mod = 1e9 + ;
const int MaxN = 1e5 + ; struct node {
int x, y, d;
}; char s[][];
int f[][][];
int presum_x[][], presum_y[][];
int n, m; void init() {
scanf("%d %d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%s", s[i] + );
for(int j = ; j <= m; j++) {
if(s[i][j] == '*') {
f[i][j][] = f[i-][j][] + ;
f[i][j][] = f[i][j-][] + ;
}
//else f[i][j][1] = f[i][j][3] = 0;
}
}
for(int i = n; i >= ; i--) {
for(int j = m; j >= ; j--) {
if(s[i][j] == '*') {
f[i][j][] = f[i+][j][] + ;
f[i][j][] = f[i][j+][] + ;
}
// else f[i][j][4] = f[i][j][2] = 0;
}
}
} vector <node> res; int main()
{
//Fio; init();
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(s[i][j] == '*') {
int d = min(min(f[i][j][], f[i][j][]), min(f[i][j][], f[i][j][]));
if(d > ) {
res.push_back((node){i, j, d-});
presum_x[i-d+][j]++; presum_x[i+d][j]--;
presum_y[i][j-d+]++; presum_y[i][j+d]--;
}
}
}
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
presum_x[i][j] += presum_x[i-][j];
presum_y[i][j] += presum_y[i][j-];
}
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(s[i][j] == '*' && presum_x[i][j] == && presum_y[i][j] == ) {
printf("-1\n");
return ;
}
}
}
printf("%d\n", res.size());
for(int i = ; i < res.size(); i++) printf("%d %d %d\n", res[i].x, res[i].y, res[i].d);
return ;
}

CF 。E2. Stars Drawing (Hard Edition) (DP)的更多相关文章

  1. 【CF】38E Let's Go Rolling! (dp)

    前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以 ...

  2. 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)

    题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 #include <bits/std ...

  3. 【Codeforces】CF 2 B The least round way(dp)

    题目 传送门:QWQ 分析 求结尾0的数量QwQ. 10只能是$ 2 \times 5 $,我们预处理出每个数因子中2和5的数量. 我们接着dp出从左上到右下的经过的最少的2的数量和最少的5的数量.两 ...

  4. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  5. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  6. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  7. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  8. 由Leetcode详解算法 之 动态规划(DP)

    因为最近一段时间接触了一些Leetcode上的题目,发现许多题目的解题思路相似,从中其实可以了解某类算法的一些应用场景. 这个随笔系列就是我尝试的分析总结,希望也能给大家一些启发. 动态规划的基本概念 ...

  9. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

随机推荐

  1. <Jmeter入门不放弃>之<3.两种常见录制脚本的方法>

    关于录制,我想表达的是,并不要以为他很低端,解决需求才是王道,大家这里参考学习的时候,我就不在这里配截图了,因为需要你打开工具根据文档自己去找,才有印象,大家一定要启动JMeter!跟着理解操作 录制 ...

  2. win10 解决telnet不是内部或外部命令的方案

    1.Telnet用于远程操作互联网中的设备或终端计算机服务器,可以有效的减少现场操作的麻烦.因为设备或终端是遍布整个省或市,有的甚至是国外,如何高效的处理问题是当务之急,除了telnet还可以ssh使 ...

  3. Regex 正则零宽断言

    http://baike.baidu.com/link?url=sLfovpZmIcS5Uz_tiidXoVtjl30Tu3wARMfhnEcbgEGzsb8g1z7dvtGNXTulu1KDodmi ...

  4. API参考文档

    Android 中文版:http://www.apiref.com/android-zh/index.html Bootstrap3 教程:http://www.apiref.com/bootstra ...

  5. windows环境下如何安装memcached教程

    Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached. 工具/原料   memcach ...

  6. 分布式调度框架TBSchedule使用方法

    一.TBSchedule简介 TBSchedule是来自淘宝的分布式调度开源框架,基于Zookeeper纯Java实现,其目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中的 ...

  7. ansible 远程执行时提示 command not found 问题

    问题 最近在学习 ansible ,在使用普通用户远程执行 ip a 命令是发现提示错误:/bin/sh: ip: command not found. 原因 command not found 命令 ...

  8. 深入解读 Redis 的持久化

    Redis持久化 Java大猿帅成长手册,GitHub JavaEgg ,N线互联网开发必备技能兵器谱 Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Red ...

  9. JavaScript中 函数的创建和调用

    基础概念:定义函数的方式   一般定义函数有两种方式:    1:函数的声明    2:函数表达式 参考资料:https://blog.csdn.net/xixiruyiruyi/article/de ...

  10. HBase优化——读写优化

    Hbase2.0查询优化 1)设置scan缓存 HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能. Scan s ...