试题请參见: 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;
}

Vijos1051. 送给圣诞夜的极光的更多相关文章

  1. Codevs 1293 送给圣诞夜的极光

    1293 送给圣诞夜的极光  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 圣诞老人回到了北极圣 ...

  2. codevs1293送给圣诞夜的极光(bfs)

    1293 送给圣诞夜的极光  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 圣诞老人回到了北极圣诞区,已经快到12点了 ...

  3. [vijos]1051送给圣诞夜的极光<BFS>

    送给圣诞夜的极光 题目链接:https://www.vijos.org/p/1051 这是一道很水很水的宽搜水题,我主要是觉得自己在搜素这一块有点生疏于是随便找了一题练手,找到这么一道水题,原本以为可 ...

  4. 洛谷 P1454 圣诞夜的极光 == codevs 1293 送给圣诞夜的极光

    题目背景 圣诞夜系列~~ 题目描述 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. 轰隆隆……烟花响起(来自中 ...

  5. 【宽搜】Vijos P1051 送给圣诞夜的极光

    题目链接: https://vijos.org/p/1051 题目大意: 给一张‘-’和‘#’的图,规定曼哈顿距离小于等于2的‘#’属于同一图案,求图案数.[曼哈顿距离:对于A(x1,y1)和B(x2 ...

  6. vijos P1051 送给圣诞夜的极光

    调了好久... #include <cstdio> #include <queue> using namespace std; char a[110*110]; /****** ...

  7. P1049送给圣诞夜的礼品(矩阵十大问题之四)

    https://vijos.org/p/1049 P1049送给圣诞夜的礼品 Accepted 标签:组合数学送给圣诞夜的礼物[显示标签]     返回代码界面 | 关闭   Pascal Pasca ...

  8. vijosP1049 送给圣诞夜的礼品

    vijosP1049 送给圣诞夜的礼品 链接:https://vijos.org/p/1049 [思路] 快速幂+矩阵转换. 将m次矩阵的转换看作是一次快速幂中的乘法操作,这样可以用O(log(k/m ...

  9. Dfs【p1454】 圣诞夜的极光

    题目描述-->p1454 圣诞夜的极光 题意概括: 寻找联通块数量,这里的连通块定义与其他的不同. 这里定义为曼哈顿距离不超过2的都属于一个联通块. 什么?不知道曼哈顿距离是啥? 曼哈顿距离简易 ...

随机推荐

  1. HDU ACM 1078 FatMouse and Cheese 记忆化+DFS

    题意:FatMouse在一个N*N方格上找吃的,每一个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的.每次最多走k步,他走过的位置能够吃掉吃的.保证吃的数量在0-100.规定他仅仅 ...

  2. [RxJS] Getting Input Text with Map

    By default, Inputs will push input events into the stream. This lesson shows you how to use map to c ...

  3. SQL Server -ISNULL()函数

    SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助. ISNULL 使用指定的替换值替换 NULL. 语法ISN ...

  4. 我的django之旅(四)模型,模板和视图

    一.结合模型,视图和模板 1.数据和模板结合 基本工作流程: (1)在views.py文件中导入我们创建的models (2)在视图函数中使用models,进行crud操作. (3)将取得的数据存入t ...

  5. mysql分库分表总结<转>

    单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...

  6. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  7. 帝国cms7.0整合百度编辑器ueditor教程

    帝国cms7.0整合百度编辑器ueditor教程开始 1.根据自己使用的帝国cms版本编码下载对应的ueditor版本 下载地址 http://ueditor.baidu.com/website/do ...

  8. js获取IP地址的方法小结

    s代码获取IP地址的三种方法,在js中取得客户端的IP地址. 原文地址:http://www.jbxue.com/article/11338.html 1,js取得IP地址的方法一 <scrip ...

  9. css 三角实例

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

  10. 转:Reddit排名算法工作原理

    http://www.aqee.net/how-reddit-ranking-algorithms-work/ 这是一篇继<Hacker News 排名算法工作原理>之后的又一篇关于排名算 ...