今天发现很少写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. P1640 [SCOI2010]连续攻击游戏【并查集】

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  2. Linux CentOS 7 防火墙/端口设置【转发】

    CentOS升级到7之后用firewall代替了iptables来设置Linux端口, 下面是具体的设置方法: []:选填 <>:必填 [<zone>]:作用域(block.d ...

  3. 关于位图数据和标记位-P3

    文章目录 1 背景 1.1 问题 2 问题1探究 2.1 没有区的情况 2.2 一个区的情况 2.3 两个区的情况 2.4 三个区的情况 2.5 四个区的情况 2.6 五个区的情况 3 问题2探究 3 ...

  4. 【react】实现动态表单中嵌套动态表单

    要实现一个功能动态表单中嵌套动态表单如下: 仔细看看antd的文档其实不难 具体步骤如下 1.建立一个 名为 ConcatRegion的组件(动态表单A)代码如下 export function Co ...

  5. EOS基础全家桶(十四)智能合约进阶

    简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ...

  6. 【一】美化Linux终端之oh-my-zsh开源项目

    目录 1.查看系统是否装了zsh 2.安装zsh(系统没有查到zsh,则安装) 3.切换shell为zsh 4.重启Linux 5.安装oh my zsh 6.到此就安装完成 7.更换主题 8.生效主 ...

  7. Spring Security 实战干货:图解Spring Security中的Servlet过滤器体系

    1. 前言 我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但是Spring Security真正的过滤器体系才是我们了 ...

  8. SpringBoot01-启动类启动做了那些事情

    1.第一个步骤进入SpringApplication构造函数 public SpringApplication(ResourceLoader resourceLoader, Class<?> ...

  9. MySQL和PHP中以整型存储IP地址

    正文:将IP地址以整型存储 一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般是用varchar或char类型存储.但是其实有更好的存储方法就是以整型存储IP地址. 因为c ...

  10. nuxt.js使用scss

    1>安装一些loader npm i node-sass sass-loader scss-loader --save-dev 2>在nuxt.config.js中配置(需要全局使用的sc ...