题意:给定一个n×m大小的字符矩阵,仅由‘.’和‘*’组成,询问这个图可否划分为一些由‘*’组成的十字形状,这些十字之间可以有重叠,

如果存在方案则输出每个十字中心坐标与边长度,无解输出-1

n,m<=1e3

思路:感觉挺独特的一个思路,并没有能力完全自主推导,还是翻译一下题解……

因为任意一组方案都可以,所以可以把每一个能放星星的地方都扩展到最大

预处理每个点上下左右能扩展的长度,四个长度取min再-1就是半径,则将这个十字中所有的方格+1

对于每一行和每一列做一下差分后的前缀和,如果某个"*"的行列前缀和至少一个大于0则能放星星(并不理解)

若存在格子"*"的行列前缀和皆为0则无解

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1100
#define oo 10000000 int f[N][N][],sx[N][N],sy[N][N],x[N*N],y[N*N],z[N*N];
char a[N][N]; int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",a[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i][j]=='*')
{
f[i][j][]=f[i-][j][]+;
f[i][j][]=f[i][j-][]+;
}
for(int i=n;i>=;i--)
for(int j=m;j>=;j--)
if(a[i][j]=='*')
{
f[i][j][]=f[i+][j][]+;
f[i][j][]=f[i][j+][]+;
}
int cnt=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i][j]=='*')
{
int t=oo;
for(int k=;k<=;k++) t=min(t,f[i][j][k]);
if(t>)
{
x[++cnt]=i; y[cnt]=j; z[cnt]=t-;
sx[i-t+][j]++; sx[i+t][j]--;
sy[i][j-t+]++; sy[i][j+t]--;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
sx[i][j]+=sx[i-][j];
sy[i][j]+=sy[i][j-];
}
int flag=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i][j]=='*'&&sx[i][j]==&&sy[i][j]==) flag=;
if(flag) printf("-1\n");
else
{
printf("%d\n",cnt);
for(int i=;i<=cnt;i++) printf("%d %d %d\n",x[i],y[i],z[i]);
}
return ;
}

【CF1015E】Stars Drawing(贪心)的更多相关文章

  1. CF 。E2. Stars Drawing (Hard Edition) (DP)

    Description: 定义一个星星由 '*' 组成,形状为一个对称的“十”字型,大小为星星 1/2 的横长(或纵长)减一(如题目中的图).给出一个 n*m 的图,判断是不是每一个 '*' 都能属于 ...

  2. Codeforces 1015E1 Stars Drawing (Easy Edition)

    题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...

  3. Codeforces Div3 #501 A-E(2) F以后补

    感觉自己有点强迫症  不都写出来就找理由不写题解 http://codeforces.com/contest/1015   题目链接 A. Points in Segments 题目意思  n个线段  ...

  4. codeforces 1015E1&&E2

    E1. Stars Drawing (Easy Edition) time limit per test 3 seconds memory limit per test 256 megabytes i ...

  5. Codeforces Round #501 (Div. 3)

    A - Points in Segments 题意:implement #include<bits/stdc++.h> using namespace std; typedef long ...

  6. Java基础之在窗口中绘图——填充星型(StarApplet 2 filled stars)

    Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.GeneralPath; @SuppressWarnin ...

  7. HDOJ 5073 Galaxy 数学 贪心

    贪心: 保存连续的n-k个数,求最小的一段方差... .预处理O1算期望. .. Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  8. [译]如何在.NET Core中使用System.Drawing?

    你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分.最初是把.NET Core作为云端框架设计的,它不包含非云端相关API.另一方 ...

  9. 【贪心科技】贪心科技内容合伙人关于AI公司及创业的演讲笔记

    贪心科技内容合伙人关于AI公司及创业的演讲笔记 视频 目录 一.投资角度对 AI 的两个基本认知 二.简单分析 AI 公司的两个纬度四个层面 三.AI 垂直行业应用的三点中美对比 四.给创业者的四个建 ...

随机推荐

  1. 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆

    二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...

  2. Fakeapp 入门教程(1):安装篇!

    在众多AI换脸软件中Fakeapp是流传最广,操作最简单的一款,当然他同样也是源于Deepfakes. 这款软件在设计上确实是花了一些心事,只要稍加点拨,哪怕是再小白的人也能学会.下面我就做一个入门教 ...

  3. 20.VUE学习之-变异方法push的留言版实例讲解

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 14.VUE学习之-v-if v-else-if语法在网站注册中的实际应用讲解

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

  5. 用python给图片添加半透明水印

    # coding:utf-8 from PIL import Image, ImageDraw, ImageFont def add_text_to_image(image, text): font ...

  6. 20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)

    多线程 多进程: 核心是多道技术,本质上就是切换加保存技术. 当进程IO操作较多,可以提高程序效率. 每个进程都默认有一条主线程. 多线程: 程序的执行线路,相当于一条流水线,其包含了程序的具体执行步 ...

  7. BFS:HDU-1072-Nightmare

    Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. 【转】Python操作MongoDB

    Python 操作 MongoDB   请给作者点赞--> 原文链接 这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面 ...

  9. HBase(0.94.5)的Compact和Split源码分析

    经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一.       Compact 2.1.   Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...

  10. 图学java基础篇之集合

    (本文部分图片引用自其他博客,最后有链接,侵删.由于笔记使用markdown记录,格式可能不是太好看,见谅) 集合结构 红字为java.util包下的,绿字为concurrent包下扩展的与并发相关的 ...