POJ-1979,Red and Black(DFS)

简介: POJ-1979,Red and Black(DFS)

Description:


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


解题思路:


如果说,你写搜索的题写的挺多了话,那么这道题可能你看到样例,就能猜到这是一道要用DFS的题,题目的大致意思就是说给你一个图,‘@’代表这个人初始的位置;‘#’代表红色瓷砖,表示不能走;‘.’代表黑色瓷砖,可以走。最后要计算的是遍历走完整幅图,一共可以经过多少块黑色瓷砖。


程序代码:  


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w,h,ans;
char map[25][25];
int num1[4]={-1,1,0,0};
int num2[4]={0,0,-1,1};
void dfs(int x,int y)
{
  map[x][y]='#';
  ans++;
  for(int i=0;i<4;i++)
  {
    int tx=x+num1[i];
    int ty=y+num2[i];
    if(tx>=0&&tx<h&&ty>=0&&ty<w&&map[tx][ty]=='.')
      dfs(tx,ty);
  }
  return ;
}
int main()
{
  while(cin>>w>>h)
  {
    if(w==0&&h==0)
      break;
    ans=0;
    int x,y;
    for(int i=0;i<h;i++)
      for(int j=0;j<w;j++)
        cin>>map[i][j];
    for(int i=0;i<h;i++)
    {
      for(int j=0;j<w;j++)
      {
        if(map[i][j]=='@')
        {
          x=i;
          y=j;
        }
      }
    }
    dfs(x,y);
    cout<<ans<<endl;
  }
  return 0;
}


相关文章
|
机器学习/深度学习 监控 自动驾驶
视觉智能详解
视觉智能详解
974 1
|
机器学习/深度学习 数据采集 资源调度
【机器学习】逻辑回归:原理、应用与实践
逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计学方法,尽管其名称中含有“回归”二字,但它实际上是一种用于解决二分类或多分类问题的线性模型。逻辑回归通过使用逻辑函数(通常为sigmoid函数)将线性模型的输出映射到概率空间,从而预测某个事件发生的概率。本文将深入探讨逻辑回归的理论基础、模型构建、损失函数、优化算法以及实际应用案例,并简要介绍其在机器学习领域的地位和局限性。
1069 2
|
存储 安全 Swift
【Swift开发专栏】Swift的懒加载与延迟初始化
【4月更文挑战第30天】Swift中的懒加载和延迟初始化是性能优化的关键技术。懒加载(lazy)推迟了变量直到首次访问时的初始化,减少启动时间和内存消耗。延迟初始化则允许变量在首次访问前保持未初始化状态。这两种方法都能提升应用性能,减少不必要的资源加载,并提高代码组织性。但要注意线程安全、资源管理以及代码可读性。
450 0
|
传感器 存储 安全
Arduino快速上手esp32方案开发
Arduino快速上手esp32方案开发
586 0
|
数据采集 机器学习/深度学习 人工智能
第1章 理解知识图谱(一)
第1章 理解知识图谱(一)
|
关系型数据库 MySQL
MySQL - 获取当天,昨天,本周,本月,上周,上月的起始时间
MySQL - 获取当天,昨天,本周,本月,上周,上月的起始时间
306 0
|
XML 网络协议 安全
主动扫描-Nmap-端口、系统、服务扫描
主动扫描-Nmap-端口、系统、服务扫描
642 0
|
安全 PHP 网络虚拟化
windows内存取证-简单
作为 Security Blue 团队的成员,您的任务是使用 Redline 和 Volatility 工具分析内存转储。您的目标是跟踪攻击者在受感染计算机上采取的步骤,并确定他们如何设法绕过网络入侵检测系统“NIDS”。您的调查将涉及识别攻击中使用的特定恶意软件系列及其特征。此外,您的任务是识别和缓解攻击者留下的任何痕迹或足迹。
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
677 0
|
数据库
uniCloud在线升级APP配置教程
uniCloud在线升级APP配置教程