查找细胞(二)-DFS

dfs不需要维护栈,更简短一些

#include<cstdio>
#include<queue>
using namespace std;

int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int cell[200][200];

void dfs(int x, int y)
{
  cell[x][y] = 0;
  for(int d = 0; d < 4; d++) {
    int tx = x + dx[d];
    int ty = y + dy[d];
    if(cell[tx][ty])
      dfs(tx, ty);
  }
}

int main()
{
  int n, m, i, j, sum = 0;
  scanf("%d%d", &n, &m);
  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%1d", &cell[i][j]);
  for(i = 1; i <= n; i++) {
    for(j = 1; j <= m; j++) {
      if(cell[i][j]) {
        sum++;
        dfs(i, j);
      }
    }
  }
  printf("%d\n", sum);
  return 0;
}

/*
4 10
0234500067
1034560500
2045600671
0000000089
*/
时间: 2025-01-08 17:51:15

查找细胞(二)-DFS的相关文章

TYVJ 1127 计算细胞数(DFS)

计算细胞数 From 陈超锐 描述 Description 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数. 如:阵列 0234500067 1034560500 2045600671 0000000089  有4个细胞 输入格式 InputFormat 第一行 :两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列  从第2行到第M+1行 每行有连续的N个字符 输出格式 Outp

查找(二)简单清晰的B树、Trie树具体解释

查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出对应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们须要面对两个或多个键都会散列到同样的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探測法. 散列表是算法在时间和空间上作出权衡的经典样例. 假设没有内存限

查找(二)简单清晰的B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

剑指offer_快速查找递增二维数组中是否存在目标

[编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 完整通过代码: public class ArrayFind { public static void main(String[] args){ int a[][]={{1,2,3},{4,5,6},{7,8,9}}; System.out.println(Find(a,7)); } public sta

查找之二折半查找(二分法查找)和插值查找

一.折半查找的前提是线性表中的记录必须好似关键码有序,线性表必须是顺序存储的. 二.折半查找 1 public class Binary_SearchDemo01 { 2 static int[] num = {0,1,3,5}; 3 public static void main(String[] args) { 4 int key = 3; 5 int x = Sequential_Search(key); 6 System.out.println(num[x]); 7 } 8 privat

求细胞数量——dfs

最近重新回顾了一下dfs,于是就打了洛谷上"求细胞数量"这一题. 这题注意要在输入时是一个一个数字读取的,因为在输入矩阵的时候没有空格.我就随便改了一下快读. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int getin(){ int num=0; char c=getchar(); whil

数组的应用:冒泡排序,折半查找及二维数组的应用

人类思维--计算机逻辑思维 逻辑思维--代码实现 写书法: 描红——临摹——碑贴——自成一体——草 复习: 数组:一维,二维,多维 一维:豆角.连续,同一类型. 定义:数据类型[] 数组名=new 数据类型[长度]{.,.,.,.}; 赋值:数组名[下标] = 值 取值:数组名[下标] 灵活运用:与for循环的结合应用. 1.求最大值,最小值. 2.求总和,平均. 3.随机(生成下标)抽值. 数组的应用: (一).冒泡排序. 1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数. 2

【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字典树 HASH表)

难产的笔记...本来打算用1天 结果前前后后拖了5天 §9.1 静态查找表 9.1.1 顺序表的查找 各种扫 自己脑补吧 复杂度O(n) 9.1.2 有序表的查找 若表是单调的,则可以利用二分查找.复杂度O(logn) 9.1.3 静态树表的查找 见 http://blog.csdn.net/area_52/article/details/43795837 9.1.4 索引顺序表的查找 建立索引表查找 §9.2 动态查找表 动态查找表的特点是,表结构本身是在查找过程中动态生成的,即对于给定值ke