首页 > 编程语言 >字符画(广州大学第十八届ACM大学生程序设计竞赛)

字符画(广州大学第十八届ACM大学生程序设计竞赛)

时间:2024-03-25 09:59:36浏览次数:30  
标签:字符 第十八届 nums 广州大学 Ljc ++ ACM int 500

题目描述

Ljc在一个大小为 n×mn \times mn×m 的画板上画了一幅字符画,画的内容由以下三种字符组成(左边的字符为字符 1,中间的为字符 2,右边的为字符 3);

Ljc不会将字符旋转或者镜像,也就是说当某个字符出现时,只会是以上图片中的形式;

Ljc是一个严谨的人,他不会在一个格子里画两次,所以任意两个字符不相交

Ljc喜欢黑色,所以所有的字符都是黑色的;

那么画中字符 1,字符 2 以及字符 3 的个数分别有多少个呢?

输入描述:

第一行包含两个整数 n,m (5≤n≤500,3≤m≤500)n,m\ (5 \leq n \leq 500, 3 \leq m \leq 500)n,m (5≤n≤500,3≤m≤500);

接下来 nnn 行每行有 mmm 个字符,'.' 表示空白格子,'#' 表示画上去的黑色格子。

输出描述:

输出三个整数,分别代表字符 1,字符 2 以及字符 3 的个数。

示例1

输入

5 11
###.###.###
#.#...#.#.#
###..##.###
#.....#.#.#
#.....#.###

输出

1 1 1

示例2

输入

10 8
....###.
..###.#.
###.###.
#.###.#.
###.#.#.
########
##.#.#.#
.###.###
.#...#.#
.#...###

输出

2 2 1

说明

思路:

当搜索到#的时候开始判断

当前这四个点任意一个为空,或者这两个点一个是空一个是# ,那么这个字符一定是F,

只要这三个绿点任意一个是空就能保证是P,剩下的情况就全是B,可以多举几个例子去试试,然后找到之后就把这个字母的位置全部清空.

#include <iostream>

using namespace std;

const int N = 510;

int n, m;
char nums[N][N];
int resp, resf, resm;

void standchangeP(int x, int y) {
    nums[x][y] = '.';
    nums[x][y + 1] = '.';
    nums[x][y + 2] = '.';
    nums[x + 1][y + 2] = '.';
    nums[x + 2][y + 2] = '.';
    nums[x + 2][y + 1] = '.';
    nums[x + 2][y + 1] = '.';
    nums[x + 1][y] = '.';
    nums[x + 2][y] = '.';
    nums[x + 3][y] = '.';
    nums[x + 4][y] = '.';
}

void standchangeF(int x, int y) {
    nums[x][y] = '.';
    nums[x][y + 1] = '.';
    nums[x][y + 2] = '.';
    nums[x + 1][y + 2] = '.';
    nums[x + 2][y + 2] = '.';
    nums[x + 2][y + 1] = '.';
    nums[x + 3][y + 2] = '.';
    nums[x + 4][y + 2] = '.';
}

void standchangeM(int x, int y) {
    nums[x][y] = '.';
    nums[x][y + 1] = '.';
    nums[x][y + 2] = '.';
    nums[x + 1][y + 2] = '.';
    nums[x + 2][y + 2] = '.';
    nums[x + 3][y + 2] = '.';
    nums[x + 4][y + 2] = '.';
    nums[x + 4][y + 1] = '.';
    nums[x + 2][y + 1] = '.';
    nums[x + 2][y + 1] = '.';
    nums[x + 1][y] = '.';
    nums[x + 2][y] = '.';
    nums[x + 3][y] = '.';
    nums[x + 4][y] = '.';
}

int main () {
    cin >> n >> m;
    getchar();
    for (int i = 0; i < n; i ++ ) {
        for (int j = 0; j < m; j ++ ) {
            nums[i][j] = getchar();
        } 
        getchar();
    }
    
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ ) {
		// f
            if (nums[i][j] == '#') {
                if (nums[i + 1][j] == '.' || nums[i + 2][j] == '.' 
                || nums[i + 3][j] == '.' || nums[i + 4][j] == '.'
                || (nums[i + 1][j - 1] == '#' && nums[i + 2][j - 1] == '.')) {
                    standchangeF(i, j);
                    resf ++;
                }
		// p
                else if (nums[i + 3][j + 2] == '.' || nums[i + 4][j + 2] == '.'
                || nums[i + 4][j + 1] == '.') {
                    standchangeP(i, j);
                    resp ++;
                }
 		// b
                else {
                    standchangeM(i, j);
                    resm ++ ;
                }
            }
        }
        cout << resp << ' ' << resf << ' ' << resm;
}

标签:字符,第十八届,nums,广州大学,Ljc,++,ACM,int,500
From: https://blog.csdn.net/chq66666/article/details/137002460

相关文章

  • ACM校赛的几个题
     c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343给大家分享一句我很喜欢我话:知不足而奋进,望远山而前行!!!铁铁们,成功的路上必......
  • 广州大学第十八届ACM大学生程序设计竞赛(同步赛)——题解
    这套题我答的很失败。没有按照题目的难度去答题,前期浪费了不少时间。题目:A-字符画题解:思维、模拟。这道题我的通过率为62.5,没有过的原因是因为对细节的处理和把控不到位,对一些点忽视,我也记录了搜索的过程,但没有把搜索过的点消掉,而且没有找到最好的顺序去解答这道题,我是按照横的......
  • SUM-ACM——VJ天梯训练赛
    这次比赛我暴露了很多问题,一些模拟还有贪心思路错误。补题如下:E-E题解:一道模拟题,我的问题在于不知道怎么替换下一个,就从0开始遍历数组然后数组的值--,如果为零就continue下一个,这个问题在于无法遍历完所有的数,会少算。其实只需要把接完水的按顺序到下一个就可以了,这样还有一个......
  • 1.6.2 ACM-ICPC技巧 分段打表
    1.6.2ACM-ICPC技巧分段打表在编程竞赛,特别是ACM-ICPC这样的顶级赛事中,参赛者往往需要掌握各种算法和技巧来解决复杂的问题。分段打表技巧是解决一些特定问题的有效方法之一,它可以在一定程度上减少算法的运行时间,提高解题效率。本节将详细介绍分段打表技巧的概念、应用场景......
  • ACM算法竞赛入门——C++基础语法(匠心之作,2.5万字总结,0基础教学,纯干货)建议收藏!!!
    xcx:主流语言这么多,为什么acm算法竞赛要用C++呢?shy:C++在竞赛中实现算法和数据结构时具有更高的执行效率,对于一些需要处理大量数据和复杂算法的竞赛题目来说,C++能够提供更快的执行速度和更低的资源消耗,这对于算法竞赛中的性能要求至关重要。hwjw:除此之外,C++还有什么其他的......
  • 4.13 ACM-ICPC算法 字符串之后缀自动机
    4.13ACM-ICPC算法:字符串之后缀自动机在竞赛编程,尤其是ACM-ICPC竞赛中,字符串算法占据了极其重要的位置。其中,后缀自动机(SuffixAutomaton,简称SAM)以其强大的功能和高效的性能,成为了解决字符串问题的利器。本文旨在介绍后缀自动机的基本概念、构建方法以及在算法竞赛中的应......
  • SUM-ACM天梯赛
    第一次天梯赛:B-B:孵化小鸡题解:二进制枚举所有可能性,一个一个枚举出来,@离散数学,真值表。题目如下:二进制枚举代码如下点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn; cout<<"输入你要枚举的个数"; cin>>n; for(inti=0;i<=(1<<n)-1;i......
  • 关于ACM中的无穷大
    常用constintmaxn=0x3f3f3f3f设置为一些题目中需要的无穷大,这个数是一个10的9次方数量级的数据,一般的数据都不会超过这个数,而且这个数还有两个特点1.这个数的两倍不超过0x7f7f7f7f,即int能表示的最大正整数。2.整数的每8位(每个字节)都是相同的。常用:memset(g,0,sizeof......
  • ACM刷题 7的意志 (水题)
    原题:https://codeforces.com/gym/103480/problem/B(7的意志)直接使用暴力递归计算即可,思路还是简单的#include<bits/stdc++.h>#defineintlonglongconstintinf=0x3f3f3f3f;#defineBlizzardstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);usingnamespace......
  • 免费ssl证书,使用acme.sh,泛解析,阿里dns自动续期
    -阿里云注册用户,添加dns可编辑权限- curlhttps://get.acme.sh|[email protected] -注意大小写exportAli_Key="<key>"exportAli_Secret="<secret>" - 执行阿里自动dns cd~/.acme.sh/./acme.sh--issue--dnsdns_ali-dexample.com-......