深度优先搜索

DFS(深度优先搜索)---踩方格

六月ゝ 毕业季﹏ 提交于 2020-01-15 05:51:44
题目描述: 题目描述 有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设: a.每走一步时,只能从当前方格移动一格,走到某个相邻的方格上; b.走过的格子立即塌陷无法再走第二次; c.只能向北、东、西三个方向走; 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案?(2种走法只要有一步不一样,即被认为是不同的方案) 输入 允许在方格上行走的步数n(n≤20)。 输出 计算出的方案数量 样例输入 2 样例输出 7 代码(DFS): # include <cstring> # include <iostream> using namespace std ; const int N = 20 ; //最大步数 int w [ N + 1 ] [ N + 1 ] ; int dfs ( int i , int j , int n ) { if ( n == 0 ) return 1 ; //没步数了,1种走法 else //还有步数可以走 { int m = 0 ; //重新计数(从当前位置到最后的步数) w [ i ] [ j ] = 1 ; //标记(为了保证当前路径不重复) if ( ! w [ i - 1 ] [ j ] ) m + = dfs ( i - 1 , j , n - 1 ) ; //北 if ( ! w [ i ] [ j - 1 ] ) m + = dfs (

深度优先搜索 — C语言版

折月煮酒 提交于 2020-01-13 09:52:41
思路:找一个入口结点,然后搜索该结点的第一个相邻结点,再搜索该相邻结点的第一个相邻结点,依次往下寻找 … … ,直到所有结点都被遍历到,算法结束,退出。 #include<stdio.h> #define MAX 100 typedef struct Graph{ int vn; char vt[MAX]; int edge[MAX][MAX]; }df; int size = 1; int getindex(char tar,char sor[],int n); void DFS(char v0,int n,int edge[][MAX],char vt[],int visited[]); int main(){ int visited[10] = {0}; df dfs; char ch = '\0'; scanf("%d",&dfs.vn); ch = getchar(); int i = 0,j = 0; for(i = 0;i < dfs.vn;i++){ scanf("%c",&dfs.vt[i]); ch = getchar(); } for(i = 0;i < dfs.vn;i++){ for(j = 0;j < dfs.vn;j++){ scanf("%d",&dfs.edge[i][j]); } } printf("\n深度优先搜索:\n"); DFS('a'

图的遍历之深度优先搜索和广度优先搜索

…衆ロ難τιáo~ 提交于 2020-01-09 23:02:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 2. 深度优先搜索图解 2.1 无向图的深度优先搜索 下面以"无向图"为例,来对深度优先搜索进行演示。 对上面的图G1进行深度优先遍历,从顶点A开始。 第1步 :访问A。 第2步 :访问(A的邻接点)C。 在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。但在本文的实现中,顶点ABCDEFG是按照顺序存储,C在"D和F"的前面,因此,先访问C。 第3步 :访问(C的邻接点)B。 在第2步访问C之后,接下来应该访问C的邻接点,即"B和D"中一个(A已经被访问过,就不算在内)。而由于B在D之前,先访问B。 第4步 :访问(C的邻接点)D。 在第3步访问了C的邻接点B之后,B没有未被访问的邻接点;因此,返回到访问C的另一个邻接点D

011带权重的无向边数据类型Edge实现

夙愿已清 提交于 2020-01-03 15:24:10
带权重的无向边数据类型Edge实现 图学习笔记索引 本文参考《算法(第4版)》 1.加权无向图数据类型EdgeWeightedGraph实现 2.总结 图学习笔记索引 图学习笔记索引(全部) 001自定义输入流In类实现 002背包数据类型Bag实现 003无向图数据类型实现 004基于图的深度优先搜索 005使用深度优先搜索找图中的所有连通分量 005-1基于深度优先搜索查找图中连通路径 006基于深度优先搜索判断图中是否存在环 007基于深度优先搜索判断一个无向图图是否是一个二分图 008广度优先搜索查找连通图中的最短路径 009有向图数据类型实现 010有向图的可达性 011带权重的无向边数据类型Edge实现 012加权无向图数据类型实现 本文参考《算法(第4版)》 1.加权无向图数据类型EdgeWeightedGraph实现 1)图文件读取 点击文字获取:流读取类In参考链接 从文件中读取图的顶点关系。 tinyEWG.txt文件中的第一行为顶点数,第二行为边数。 第三行到最后是两个相邻的顶点即边的权重: 8 16 4 5 0.35 4 7 0.37 5 7 0.28 0 7 0.16 1 5 0.32 0 4 0.38 2 3 0.17 1 7 0.19 0 2 0.26 1 2 0.36 1 3 0.29 2 7 0.34 6 2 0.40 3 6 0.52 6 0 0

DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

我怕爱的太早我们不能终老 提交于 2020-01-02 21:46:16
一.题目 题目链接: 迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡了会儿觉自然就懂了,说明什么,不会的时候就要睡觉!!!(绝对不是宿舍蹲的借口!!)学会了迷宫,说明你对DFS已经有了一定程度的掌握了,递归也很熟悉了! 题目介绍: 题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 题目描述 无 输入格式 第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。 输出格式 给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 输入输出样例 输入 #1 复制 2 2 1 1 1 2 2 1 2 输出 #1 复制 1 说明/提示 【数据规模】 1≤N,M≤5 说说我的思路吧,对于这道迷宫的题目,人所操纵的物体,只有四种选择,要么上,要么下,要么左,要么右,所以对迷宫类问题,只需要对这四种情况递归就行了,遇到不符合就回溯。这道题目只是说记录能到达的路线个数

博客作业06--图

纵然是瞬间 提交于 2019-12-30 00:56:32
1.学习总结 1.1图的思维导图 1.2 图结构学习体会 深度优先遍历与广度优先遍历 不同点:广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索。因为由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的 广度优先搜索适用范围:在未知树深度情况下,用这种算法很保险和安全。在树体系相对小不庞大的时候,广度优先也会更好些。 深度优先搜索适用范围:刚才说了深度优先搜索又自己的缺陷,但是并不代表深度优先搜索没有自己的价值。在树深度已知情况下,并且树体系相当庞大时,深度优先搜索往往会比广度优先搜索优秀,因为比如8*8的马踏棋盘中,如果用广度搜索,必须要记录所有节点的信息,这个存储量一般电脑是达不到的。然而如果用深度优先搜索的时候却能在一个棋盘被判定出来后释放之前的节点内存。 Prim和Kruscal算法 Prim算法的实现过程:首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出最小生成树中各结点权重最小的边,并加到最小生成树中。(加入之后如果产生回路了就要跳过这条边,选择下一个结点。)当所有的结点都加入到最小生成树中后,就找出了这个连通图的最小生成树。 Kruskal算法的实现过程:Kruskal算法在找最小生成树结点之前,需要对权重从小到大进行排序

深度优先搜索DFS

醉酒当歌 提交于 2019-12-18 06:32:26
深度优先搜索DFS 它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。 深度优先搜索一般通过栈来实现。 二叉树的先序遍历:LeetCode144 class Solution { public List < Integer > preorderTraversal ( TreeNode root ) { LinkedList < TreeNode > stack = new LinkedList ( ) ; List < Integer > res = new ArrayList ( ) ; //根、左、右 while ( ! stack . isEmpty ( ) || root != null ) { if ( root != null ) { res . add ( root . val ) ; stack . offer ( root ) ; root = root . left ; } else { root = stack . pollLast ( ) ; root = root . right ; } } return res ; } } 二叉树的中序遍历:LeetCode94 class Solution { public List < Integer >

DFS_BFS(深度优先搜索 和 广度优先搜索)

狂风中的少年 提交于 2019-12-10 20:03:47
package com.rao.graph; import java.util.LinkedList; /** * @author Srao * @className BFS_DFS * @date 2019/12/10 19:16 * @package com.rao.graph * @Description 深度优先搜索 和 广度优先搜索 */ public class BFS_DFS { /** * 图的顶点 */ private static class Vertex{ int data; Vertex(int data){ this.data = data; } } /** * 图(邻接表) */ private static class Graph{ private int size; private Vertex[] vertices; //存放每个顶点的链表 private LinkedList<Integer>[] adj; Graph(int size){ this.size = size; vertices = new Vertex[size]; adj = new LinkedList[size]; for (int i = 0; i < size; i++) { vertices[i] = new Vertex(i); adj[i] = new

使用深度优先搜索DFS求解star battle游戏

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-06 03:42:30
  这里的star battle游戏不是指别的(像war frame),就是puzzle team club搞的游戏,在 https://www.puzzle-star-battle.com/ 里面可以找到。   这里要解题的话,不能再像上回那样用舞蹈表(dancing link)了,因为游戏规则决定了方块的占用位置不是全部都要用,一个方格可以相邻1个或2个星星,无法像之前那样使用精确覆盖的做法。但是,这里要解题还是很简单的,约束条件的某一种(行内必须正好有n个星星)可以利用这点搞DFS。   star battle的规则如下:放置一定数量的星星在棋盘,使所有的星星邻近8格没有星星,且每行、每列、每个区域正好有指定数量的星星,至于指定数量是多少要看星星★左边是哪个数字    图1.1★表示每行每列每块必须正好有1个星星;3★则是正好有3个   这里就需要初始化每行每列每块占据的星星数为指定数字(这里的深度优先搜索参数就是行数,操作也是基于单行搜索,所以省略了每行占据星星数) def init(): with open('starBattleChess1.txt','r') as f: chessStr = f.read() rowStrs = chessStr.split('\n') global rowsize, colsize rowsize = len(rowStrs)

《算法》笔记 10 - 无向图

寵の児 提交于 2019-12-05 12:17:22
表示无向图的数据结构 邻接表数组 深度优先搜索 深度优先搜索寻找路径 深度优先搜索的性能特点 广度优先搜索 两种搜索方式的对比 图表示由相连的结点所表示的抽象模型,这个模型可以用来研究类似“能否从某个点到达指定的另一个点”、“有多少个结点和指定的结点相连”、“两个结点之间最短的连接是哪一条”。图的算法与很多实际问题相关。比如地图、搜索引擎、电路、任务调度、商业交易、计算机网络、社交网络等。 无向图是一种最简单、最基本的图模型,仅仅由一组顶点和一组能够将两个顶点相连的边组成。 在图的实现中,用从0开始的整数值来表示图的结点,用类似8-5来表示连接结点8和5的边,在无向图中,这与5-8表示的是同一条边。4-6-3-9表示的是4到9之间的一条路径。 表示无向图的数据结构 无向图的API public class Graph{ Graph(int V) //创建一个含有V个顶点但不含有边的图 Graph(In in) //从标准输入流in读入一幅图 int v() //顶点数 int E() //边数 void addEdge(int v, int w) //向图中添加一条边v-w Iterable<Integer>adj(intv) //和相邻的所有顶点 String toString() //对象的字符串表示 } 第二个构造函数接受的输入由2*E+2个整数组成,前两行分别是V和E