试题请參见: 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. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  2. 将samba加入到windows域《转载》

    将samba加入到windows域 那什么是域呢? 一台Windows计算机,它要么隶属于工作组,要么隶属于域.所以说到域,我们就不得不提一下工作组,工作组是MS的概念,一般的普遍称谓是对等网. 工作 ...

  3. 转载:android——eclipse如何去除Ctrl+shift+R组合键查找到的.class文件

    转载自:http://blog.csdn.net/virgilli/article/details/22500409 AS里面的build文件下一堆的.class 文件,当你要定位资源文件的时候,有些 ...

  4. AngularJs练习Demo3

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  5. PowerDesigner与UML建模应用

    一.   PD简介 PowerDesigner 是一个集所有现代建模技术于一身的完整工具,它集成了强有力的业务建模技术.传统的数据库分析和实现,以及UML对象建模.通过了元数据的管理.冲突分析和真正的 ...

  6. Visifire Chart控件设置 柱状图 条的宽窄

     Chart myChart = new Chart();myChart.DataPointWidth = 5;宽度以PlotArea的百分比为单位,如下例: chart.Width = 500; c ...

  7. Js 时间间隔计算(间隔天数)

    function GetDateDiff(startDate,endDate)  {      var startTime = new Date(Date.parse(startDate.replac ...

  8. (二)原生JS实现 - 事件类方法

    事件处理 - 添加事件 var addEventHandler = function (oTarget, sEventType, fnHandler) { if (oTarget.addEventLi ...

  9. C语言中的指针数组和数组指针

    代码: #include <iostream> using namespace std; int main(){ ]; ]; cout<<sizeof(a)<<en ...

  10. 【原创】C++中对象的序列化

    1.对象序列化 对象的序列化是指将对象的状态信息转换为可以存储或者传输的形式的过程.对象的反序列化是与序列化相反的过程. 在序列化期间,对象将其当前的状态写入到临时或者永久性的存储区,可以通过从存储区 ...