今天发现很少写dfs..

dfs主要思想是递归

bfs主要靠队列

先说一下这个题我被阻了半个小时的地方:

1读数一定要注意scanf的吃回车

2注意数据类型为char,判断时是'0'

dfs:

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <time.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
/*
* 大约就这个思路叭,
* dfs:
* 需要找一个存数的数组以及一个存是否遍历的数组
* 然后移动方向的数组
* 主函数中就每个地方遍历找没有走过的
* dfs函数中,就找找它四个方向有没有没有走过的,然后dfs递归进去
* 每次注意别忘了更新cnt以及判断是否经过的数组
*/ int vis[][];//标记
char a[][];//存数
int ax[]={,,,-};
int ay[]={,-,,};
int cnt=;
int m,n;
void dfs(int i,int j) { for (int k = ; k < ; ++k) {
int nx = i + ax[k];
int ny = j + ay[k];
if (nx < || ny < || nx >= m || ny >= n)
continue;
if (a[nx][ny] != '' && vis[nx][ny] == ) {
vis[nx][ny] = ;
dfs(nx, ny);
} }
}
int main() {
memset(vis, , sizeof(vis)); cin >> m >> n;
// for(int i=0;i<m;i++) {
// scanf("%s", a[i]);
// }//这个也是正确的 // for (int k = 0; k < m; ++k) {
// for (int i = 0; i < n; ++i) {
// scanf("%c",&a[k][i]);
// }
// }//这个是个错的,你忽视了吃回车的问题
for (int k = ; k < m; ++k) {
for (int i = ; i < n; ++i) {
cin>>a[k][i];
}
}
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) { if (a[i][j] != '' && vis[i][j] == ) {
cnt++;
vis[i][j] = ;
dfs(i, j);
}
}
}
cout << cnt << endl;
}

dfs:

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <time.h>
#include <algorithm>
#include <stdio.h>
#include <queue>
using namespace std;
/*bfs:
* 主要是队列+对象
* 本题中的对象就是那个结构体(x,y)
* 主函数大体思路跟dfs是一样的,也是搜索所有的格子判断满足题意的
* bfs函数基本思路:
* 先标记已读
* 取队列头,并弹出
* 然后四个方向判断,有满足题意就放入队列.
*
*
* 不同的题,大体就换一下判断条件以及cnt++的地方
*
* 本题满足题意的条件:
* 第一是不能越界(for all)
* 第二是未走过且不为0
*/ int vis[][];//标记
char a[][];//存数
int ax[]={,,,-};
int ay[]={,-,,};
int cnt=;
int m,n;
struct Point{
int x;
int y;
};
Point p[];
queue<Point> q;
void bfs(int i,int j) {
vis[i][j] = ;
q.push({i, j});
Point first = q.front();
q.pop();
for (int k = ; k < ; ++k) {
int nx = first.x + ax[k];
int ny = first.y + ay[k];
if (nx < || ny < || nx >= m || ny >= n)
continue;
if (a[nx][ny] != '' && vis[nx][ny] == ) {
q.push({nx, ny});
}
} } int main(){
memset(vis, , sizeof(vis)); cin >> m >> n;
for (int k = ; k < m; ++k) {
for (int i = ; i < n; ++i) {
cin>>a[k][i];
}
}
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) { if (a[i][j] != '' && vis[i][j] == ) {
bfs(i,j);
cnt++;
}
}
}
cout << cnt << endl;
}

以细胞为例 说一下dfs和bfs的思路的更多相关文章

  1. 51-迷宫(一)- java版dfs和bfs

    一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数 nn ...

  2. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  3. DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告

    DFS and  BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...

  4. Clone Graph leetcode java(DFS and BFS 基础)

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  5. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  6. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  7. 在DFS和BFS中一般情况可以不用vis[][]数组标记

    开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]= ...

  8. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  9. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

随机推荐

  1. 去除List集合中的重复值(四种好用的方法)(基本数据类型可用)

    最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合. 但是赋给set集合后,由于se ...

  2. HTML5(三)SVG vs. Canvas

    HTML5 内联 SVG 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 ...

  3. vue页面数据强制更新渲染

        vue数据更新会出现缓存的情况,几种方式可以让数据实时渲染到页面: 1.简单粗暴的方式 this.$forceUpdate();//强制更新 2.增减元素 splice() push() 3. ...

  4. Windows Socket编程精华《TCP通信服务器》

    1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问 ...

  5. Java多线程编程基础知识汇总

    多线程简介 多任务   现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...

  6. 前端01 /HTML简单简绍

    前端01 /HTML简单简绍 目录 前端01 /HTML简单简绍 1.web服务本质 2.浏览器的工作流程 3.HTML是什么 4.web服务本质 5.HTML文档结构 6.HTML注释 6.标签语法 ...

  7. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  8. node最简单的本地服务搭建

    **1.首先需要安装node** [node下载链接](http://nodejs.cn/download/)**2.需要安装http的镜像文件** npm install http-server - ...

  9. 深入理解JVM(③)再谈线程安全

    前言 我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的.因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然 ...

  10. 资深CIO介绍如何选型OA系统的?

    OA办公系统成为企业管理的标配软件,在于可有效加强组织管理能力,提高员工协同效率,助力企业科学决策,合理分配企业资源,提升企业综合实力与市场竞争力.企业OA选型的经验总结来说也就是品牌.技术.产品.服 ...