A - Red and Black

题目

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.

Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

'.' - a black tile
        '#' - a red tile
        '@' - a man on a black tile(appears exactly once in a data set)
        The end of the input is indicated by a line consisting of two zeros.

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13

大致题意

输入两个正整数W和H,再给出一个W×H的二维字符数组,其中 '.' 代表黑色瓷砖,'#' 代表红色色瓷砖,'@' 代表人目前所在位置,人可以移动到相邻的四块黑色瓷砖上,但不能移动到红色瓷砖上。求该人最多可以到达的黑色瓷砖的数量。

思路

        首先我们可以在输入二维字符数组的时候就找到 ‘@’ 的所在坐标,接着再将该坐标放入dfs中搜索与其联通的 ‘.’ ,将所有与 ‘@’ 联通的 ‘.’ 全部变为 除了以上三种字符 的任意字符,在这里我是将其变为 '!' ,注意人只能上下左右的走,不能斜着走。最后再统计一遍 '!' 的数量即可。

代码

#include<iostream>
using namespace std;
int n, m, xp, yp, ans;
char a[25][25];
void dfs(int x, int y)
{if (x<0 || y<0 || x>n || y>m){return;}if (a[x][y] == '.' || a[x][y] == '@')//在这里我顺便把‘@’也一起处理了{//先将合法的位置变为‘!’a[x][y] = '!';//将此位置的上下左右都遍历一遍dfs(x - 1, y);dfs(x + 1, y);dfs(x, y - 1);dfs(x, y + 1);}return;
}
int main()
{while (1){ans = 0;cin >> m >> n;if (!n && !m)//结束条件判断,如果n==0并且m==0就结束输入{break;}//注意每次输入都要将二维字符数组a给重置一下,否则上次输入的数据可能会影响到这次的结果for (int i = 0; i < 25; ++i){for (int j = 0; j < 25; ++j){a[i][j] = '#';}}for (int i = 0; i < n; ++i){for (int j = 0; j < m; ++j){cin >> a[i][j];if (a[i][j] == '@'){xp = i, yp = j;//记录‘@’的坐标}}}dfs(xp, yp);for (int i = 0; i < n; ++i){for (int j = 0; j < m; ++j){if (a[i][j] == '!')//统计数量{++ans;}}}cout << ans << endl;}return 0;
}

GDUT - 专题学习1 A - Red and Black相关推荐

  1. GDUT - 专题学习3 G - 食物链

    题目 如图所示为某生态系统的食物网示意图,据图回答此题. 现在给你 n 个物种和 m 条能量流动关系,求其中的食物链条数. 物种的名称为从 1 到 n 的编号. mm 条能量流动关系形如 a1​ b1 ...

  2. GDUT - 专题学习1 I - 滑动窗口

    I - 滑动窗口 题目 原题来自:POJ 2823 给一个长度为 N 的数组,一个长为 K 的滑动窗体从最左端移至最右端,你只能看到窗口中的 K 个数,每次窗体向右移动一位,如下图: 你的任务是找出窗 ...

  3. GDUT - 专题学习1 C - 马走日

    C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...

  4. GDUT - 专题学习1 D - 一维前缀和

    D - 一维前缀和 题目 一天,在宿舍睡觉的你,突然梦到了游戏之神,他说:去玩<极限脱出>吧,这部作品的剧情和世界观绝对会带来很大的震撼,值得一玩. 对了,这部作品的第一代发布在nds上, ...

  5. GDUT - 专题学习2 C - 开餐馆

    C - 开餐馆 题目 蒜头君想开家餐馆. 现在共有 n 个地点可供选择.蒜头君打算从中选择合适的位置开设一些餐馆.这 n 个地点排列在同一条直线上.我们用一个整数序列 m1​,m2​,...mn​ 来 ...

  6. 莫比乌斯反演专题学习笔记

    莫比乌斯反演专题学习笔记 本文记录一些和莫反有关的内容的笔记 可能存在诸多谬误,阅读时请谨慎分析 若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激! 为什么要学莫比乌斯反演? 解决一类与狄利克雷卷 ...

  7. Python模块EasyGui专题学习

    Python模块EasyGui专题学习 1.msgbox(msg,title,ok_button="OK",image="",root=None) 代码 imp ...

  8. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划

    [摘要] 请暂时忘掉你的对象,感受一切皆流的世界. 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编 ...

  9. 20210501:字符串与哈希表力扣专题学习记录

    字符串与哈希表力扣专题学习记录 题目 思路与算法 代码实现 写在最后 题目 字母异位词分组 无重复字符的最长子串 重复的DNA序列 最小覆盖子串 思路与算法 字母异位词分组 : 按照字母序排序后再映射 ...

最新文章

  1. F5 network
  2. Vysor_v1.6.9
  3. How to be a hacker
  4. 如何看Cortex-M系列处理器差异与共性?技术老司机Joseph带你飞
  5. 为什么要使用Entity Framework
  6. 分时系统的用户具有独占性,因此一个用户可以独占计算机系统的资源.,课件2016计算机操作系统试题库(判断).doc...
  7. App开发流程之创建项目和工程基本配置
  8. 【华为云技术分享】当我们在谈论卡片时,我们到底在谈论什么?
  9. java分布式(java反汇编)
  10. linux安装 web2py,TurnkeyLinux上用于Web2Py到MySQL的DAL连接字符串
  11. 6位行政区划代码与4位银行地区代码对应表
  12. 阿里Java开发规范IDEA开发插件
  13. 2019安徽省程序设计竞赛 D.自驾游(最短路)
  14. Origin画图技巧之回归(标准值与预测值)
  15. Python实现图像的手绘效果
  16. 短信验证(吉信通),邮箱验证
  17. 华为云服务器默认jdk版本,华为云服务器centos7.3 安装jdk
  18. 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)
  19. 一曲京声人去远——纪念刘大中校友100周年诞辰
  20. NIO效率高的原理之零拷贝与直接内存映射

热门文章

  1. 2022年2月份泰森云资源分享下载列表 17/20
  2. 【Vue】Vue全家桶(三)Vue组件通信+Vue组件插槽+动画与过渡+使用vue-cli解决Ajax跨域问题
  3. 微信公众号下载神器—WeChatDownload
  4. python实现selenium文件上传的两种方式
  5. ArcGIS水文分析实战教程(7)细说流域提取 1
  6. vscode最强摸鱼指南,老板站在身后也看不出来的那种
  7. TS之自动编译和项目编译
  8. Android高中低端机整理,高中低端都有 各品牌新上市安卓机汇总
  9. Wi-Fi无线技术介绍
  10. python 寻找MC宝藏的具体位置