Vijos1051. 送给圣诞夜的极光

Vijos1051. 送给圣诞夜的极光

大家好,又见面了,我是全栈君。

试题请參见: https://vijos.org/p/1051

题目概述

圣诞老人回到了北极圣诞区, 已经快到12点了. 也就是说极光表演要開始了. 这里的极光不是极地特有的自然极光景象. 而是圣诞老人主持的人造极光. 

轰隆隆……烟花响起(来自中国的浏阳花炮之乡). 接下来就是极光表演了. 

人造极光事实上就是空中的一幅幅n*m的点阵图像. 仅仅是由于特别明亮而吸引了非常多非常多小精灵的目光, 也成为了圣诞夜最漂亮的一刻. 

然而在每幅n*m的点阵图像中, 每个点仅仅有发光和不发光两种状态. 对于全部的发光的点, 在空中就形成了漂亮的图画. 而这个图画是以若干个(s个)图案组成的. 对于图案, 圣诞老人有着严格的定义:对于两个发光的点, 假设他们的曼哈顿距离(对于A(x1,y1)和B(x2,y2), A和B之间的曼哈顿距离为|x1-x2|+|y1-y2|)小于等于2. 那么这两个点就属于一个图案……

小精灵们一边赞赏着极光, 一边数着每一幅极光图像中的图案数. 伴着歌声和舞蹈, 度过了漂亮的圣诞之夜. ^_^

输入

第一行, 两个数n和m.

接下来一共n行, 每行m个字符. 对于第i行第j个字符, 假设其为“-”, 那么表示该点不发光, 假设其为“#”, 那么表示该点发光. 不可能出现其它的字符.

输出

第一行, 一个数s.

解题思路

Reference: http://chengchen2008.blog.163.com/blog/static/2834647520097207256587/

深度优先搜索

① 两个二维布尔数组: 用于存储地图和遍历记录
② 寻找每一个坐标
③ 对于每一个坐标。推断
        o
     o o o
   o o # o o
     o o o
        o

以#为中心,推断以上几个位置(“o”)
若map[i][j]和used[i][j]都为真, 则继续在那个点进行深搜, 每搜索到一个点, 把那个点(use[i][j])置为false

遇到的问题

写之前还记得的, 写着写着就忘了.

小心数组下标越界啊~!! 递归调用的时候记得推断边界.

源码

#include <iostream>
#include <fstream>

const int SIZE = 100;

bool graph[SIZE][SIZE] = {0};
bool used[SIZE][SIZE] = {0};

void getNeighborPoint(int i, int j, int n, int m) {
    if ( i < 0 || j < 0 || i >= n || j >= m ) {
        return;
    }
    if ( graph[i][j] && !used[i][j] ) {
        used[i][j] = true;
        getNeighborPoint(i - 2, j, n, m);
        getNeighborPoint(i - 1, j - 1, n, m);
        getNeighborPoint(i - 1, j, n, m);
        getNeighborPoint(i - 1, j + 1, n, m);
        getNeighborPoint(i, j - 2, n, m);
        getNeighborPoint(i, j - 1, n, m);
        getNeighborPoint(i, j + 1, n, m);
        getNeighborPoint(i, j + 2, n, m);
        getNeighborPoint(i + 1, j - 1, n, m);
        getNeighborPoint(i + 1, j, n, m);
        getNeighborPoint(i + 1, j + 1, n, m);
        getNeighborPoint(i + 2, j, n, m);
    }
}

int main() {
    using std::cin;
    // std::ifstream cin;
    // cin.open("input.txt");

    int n = 0, m = 0;
    int numberOfGraphs = 0;

    // Input
    cin >> n >> m;
    for ( int i = 0; i < n; ++ i ) {
        for ( int j = 0; j < m; ++ j ) {
            char point = 0;
            cin >> point;
            graph[i][j] = ( point == '#' ? true : false );
        }
    }

    // Processing
    for ( int i = 0; i < n; ++ i ) {
        for ( int j = 0; j < m; ++ j ) {
            if ( graph[i][j] && !used[i][j] ) {
                getNeighborPoint(i, j, n, m);
                ++ numberOfGraphs;
            }
        }
    }

    // Output
    std::cout << numberOfGraphs << std::endl;

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115785.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月30日 下午5:00
下一篇 2022年1月30日 下午5:00


相关推荐

  • 私有化部署首选:OpenClaw|数商云合规安全方案

    私有化部署首选:OpenClaw|数商云合规安全方案

    2026年3月12日
    2
  • react路由传参的几种方式[通俗易懂]

    react路由传参的几种方式[通俗易懂]第一种传参方式,动态路由传参通过设置link的path属性,进行路由的传参,当点击link标签的时候,会在上方的url地址中显示传递的整个url<Linkto=’/home?name=dx’>首页</Link>如果想真正获取到传递过来的参数,需要在对应的子组件中this.props.location.search获取字符串,再手动解析因为传参能够被用户看见…

    2022年6月11日
    99
  • 拉格朗日乘数法求得的是最值还是极值_微观经济拉格朗日方程求极值

    拉格朗日乘数法求得的是最值还是极值_微观经济拉格朗日方程求极值一、拉格朗日乘数法简介在日常的生产生活中,当我们要要安排生产生活计划的时候,常常会在现实物理资源约束的条件下,计算得到收益最大或者损失最小的计划;像这种对自变量有附加条件的极值称为条件极值;拉格朗日乘数法是一种直接计算解决条件极值的方法;拉格朗日乘数法的定义如下:设有f(x,y),φ(x,y)f(x,y),\varphi(x,y)f(x,y),φ(x,y)两个函数,并且两者都有一阶连续偏导数,则做拉格朗日函数为F(x,y,λ)=f(x,y)+λφ(x,y)F(x,y,\lambda)

    2025年5月23日
    5
  • SNMPWALK 命令「建议收藏」

    SNMPWALK 命令「建议收藏」SNMPWALK是一个通过SNMPGET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作。命令行:snmpwalk[选项]agent[oid]选项参数:由于SNMP协议中,不同的协议版本存在不同的参数选项,以下参数按协议分开说明。1.   普通选项a)   –h   显示帮助b)   –v1|2c|3

    2022年6月16日
    38
  • 虚拟矿机服务器架设,云服务器搭建矿机

    虚拟矿机服务器架设,云服务器搭建矿机云服务器搭建矿机内容精选换一换在专属主机资源上创建云服务器失败 可能由以下原因造成 您所选择的云服务器规格不在您已有的专属主机支持范围内 各类型专属主机支持的云服务器规格请参见概述 各类型专属主机支持的云服务器规格请参见概述 您的专属主机资源不足 无法创建您所选择的云服务器规格 您可以查看专属主机的剩余 vCPU 和内存数量是否满足您所选择的云服务器规格 如果资源不足 您弹性云服务器 Elastic

    2026年3月17日
    2
  • 路由技术——OSPF

    路由技术——OSPF基础理论部分 邻居关系建立 1 OSPF 报文类型以及每一种报文的作用 提示 hello 作用有 4 个 答 OSPF 报文一共有 5 种 1 gt Hello 作用 1 发现邻居 2 维护邻居关系 3 选举 DR BDR4 保证邻居的双向通信 2 gt DBD Databasedesc 1 选举 DR BDR2 交互数据库摘要信息 3 gt LSR LSARequest 向对方请求对方有 本地没有的 LSA 信息 4 gt LSU LSAUpdate 给邻居发送 LSA 信

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号