题面:

传送门

题目描述:

要求用十字星星来画题目给出的“星”图。如果不能用十字星星来画“星”图,输出-1;如果能,则输出要在图的哪个位置画相应大小的十字星图。
 

题目分析:

这道题纯属模拟题,按照要求画就好了。我的画法:根据题目的“星”图用十字星图在另一个二维数组画“星”图。拿第一个样例来说:当遍历到第一颗星星,我就会检查是否能用十字星星去按题目给出的“星图”填充:
显然,第一个星星不能用十字星星去画图。那么这里哪些星星可以画呢?我们可以看出来这个星星可以画:
在这里我们在另外一个二维数组画大小为1的十字星星:
然后我们又发现了可以画一个大小为3的十字星星:
这时,我们就成功用十字星星画出原来的星图。检查是否成功,直接把原星图和自己画的星图(二维数组)遍历一遍比较是否相等就行了。但是,在画的过程中,我们每画一次星图就要检查一遍吗?其实是不需要的。因为我们也可以多“画”,比如像这样:
当我们从上到下,从左到右遍历一遍,画到这个星星的时候:
显然,还没画这个位置的十字星图时,自己画的星图之前就已经画好了(之前在第2行第5列画大小为1的十字星星,在第3行第4列画大小为1的十字星星,在第3行第5列画大小为3的十字星星,在第3行第6列画大小为1的十字星星)。但是题目允许“覆盖”,也就是我在这个位置画大小为1的十字星星也不会错,那么我们就在这里画个十字星星,把这个也输出到结果。这样做的好处是:遍历完原星图所有星星后,只需要检查一遍就可以知道是否能用十字星星画出原星图。要注意的是,画十字星星要画:能画的最大大小。
 
 
AC代码:
 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 #include <stack>
6 #include <queue>
7 using namespace std;
8 const int maxn = 105;
9 char a[maxn][maxn]; //原星图
10 int point[maxn][maxn]; //自己画的图
11 int dr[4] = {-1, 1, 0, 0}, dc[4] = {0,0,-1,1}; //上下左右
12 int n, m;
13
14 struct node{
15 int x;
16 int y;
17 int type;
18 };
19
20 queue<node> q; //用队列保存结果
21
22 int check(int r, int c){ //检查是否能画
23 int flag;
24 int r1, c1;
25 node temp;
26 temp.type = 0;
27 for(int sizes = 1; sizes <= 50; sizes++){
28 flag = 1;
29 for(int i = 0; i < 4; i++){
30 r1 = r + dr[i]*sizes;
31 c1 = c + dc[i]*sizes;
32 if(r1 >= 0 || r1 < n || c1 >= 0 || c1 < m){
33 if(a[r1][c1] != '*') flag = 0; //如果上下左右不是星号就不能画
34 }
35 else {flag = 0; break;}
36 }
37
38 if(flag){ //保存能画的最大十字星星
39 point[r][c] = 1;
40 for(int i = 0; i < 4; i++){
41 r1 = r + dr[i]*sizes;
42 c1 = c + dc[i]*sizes;
43 point[r1][c1] = 1;
44 }
45 temp.type = sizes;
46 temp.x = r;
47 temp.y = c;
48 }
49 else break;
50 }
51 if(temp.type) {q.push(temp);return 1;} //把结果加入队列
52 return 0;
53 }
54
55 bool check2(){ //检查画出来的是否和原星图一致
56 for(int i = 0; i < n; i++){
57 for(int j = 0; j < m; j++){
58 if(a[i][j] == '*'){
59 if(point[i][j]==0) return false;
60 }
61 }
62 }
63 return true;
64 }
65
66 int main(){
67 memset(a, 0, sizeof(a));
68 memset(point, 0, sizeof(point));
69 cin >> n >> m;
70 for(int i = 0; i < n; i++) cin >> a[i];
71
72 int cnt = 0; //计数
73 node temp;
74 for(int i = 0; i < n; i++){
75 for(int j = 0; j < m; j++){
76 if(a[i][j] == '*'){
77 if(check(i, j)){ //符合条件就画
78 cnt++;
79 }
80 }
81 }
82 }
83
84 if(check2()){
85 printf("%d\n", cnt);
86 while(!q.empty()){
87 temp = q.front(); q.pop();
88 printf("%d %d %d\n", temp.x+1, temp.y+1, temp.type);
89 }
90 }
91 else cout << -1 << endl;
92 return 0;
93 }
 

Codeforces 1015E1 Stars Drawing (Easy Edition)的更多相关文章

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

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

  2. codeforces 1015E1&&E2

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

  3. Codeforces Round #574 (Div. 2) D1. Submarine in the Rybinsk Sea (easy edition) 【计算贡献】

    一.题目 D1. Submarine in the Rybinsk Sea (easy edition) 二.分析 简单版本的话,因为给定的a的长度都是定的,那么我们就无需去考虑其他的,只用计算ai的 ...

  4. Codeforces - 1195D1 - Submarine in the Rybinsk Sea (easy edition) - 水题

    https://codeforc.es/contest/1195/problem/D1 给\(n\)个等长的十进制数串,定义操作\(f(x,y)\)的结果是"从\(y\)的末尾开始一个一个交 ...

  5. Codeforces 263A. Appleman and Easy Task

    A. Appleman and Easy Task time limit per test  1 second memory limit per test  256 megabytes input  ...

  6. codeforces#1163C2. Power Transmission (Hard Edition)(计算几何)

    题目链接: https://codeforces.com/contest/1163/problem/C2 题意: 给出$n$个点,任意两点连接一条直线,求相交直线的对数 数据范围: $1 \le n ...

  7. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  8. Codeforces 1118F1 Tree Cutting (Easy Version) (简单树形DP)

    <题目链接> 题目大意: 给定一棵树,树上的点有0,1,2三中情况,0代表该点无色.现在需要你将这棵树割掉一些边,使得割掉每条边分割成的两部分均最多只含有一种颜色的点,即分割后的两部分不能 ...

  9. CodeForces 690D1 The Wall (easy) (判断连通块的数量)

    题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...

随机推荐

  1. 6.Header交换机之模拟验证用户身份

    标题 : 6.Header交换机之模拟验证用户身份 目录 : RabbitMQ 序号 : 6 var channel = connection.CreateModel(); ​ //设置服务质量 ch ...

  2. ARMv7-A 架构下的MMU

    ARM架构中MMU的作用主要就是将CPU发出的虚拟地址转换成为物理地址,从实现内核和用户程序和用户程序之间的虚拟地址空间隔离.MMU的主要组成为两部分,其一是内部的TLBs缓存:还有就是转换表装换单元 ...

  3. 016.NET5_MVC_视图组件扩展定制

    视图组件 1. 呈现页面响应的某一部分而不是整个响应 2. 包括在控制器和视图之间发生的关注分类和可测试优势 3.可以具有参数和业务逻辑 4. 通常在页面局部调用 如何自定义视图组件? 1.Razor ...

  4. prefetch & preload & prerender & dns-prefetch & preconnect

    prefetch & preload & prerender & dns-prefetch & preconnect performance optimization ...

  5. VirtualBox All in One

    VirtualBox All in One 虚拟机 / VM / Virtual Machine x86 and AMD64/Intel64 VirtualBox is a powerful x86 ...

  6. select notes mark

    select notes mark mark-line https://time.geekbang.org/column/article/224545

  7. Taro Next

    Taro Next Taro 2.0 https://aotu.io/notes/2020/02/03/taro-next-alpha/index.html Taro Next 的迁移指南 https ...

  8. JavaScript高级-类的使用

    1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...

  9. Mysql的join算法

    本文转载自Mysql的join算法 导语 在Mysql中,使用Nested-Loop Join的算法思想去优化join,Nested-Loop Join翻译成中文则是"嵌套循环连接" ...

  10. java荷兰国旗问题

    荷兰国旗包含三种颜色:红.白.蓝. 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列.它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素.等 ...