dfs

Dungeon Master DFS和BFS

让人想犯罪 __ 提交于 2020-01-31 01:30:46
//啊啊啊 终于被我搞定 //这个题写了快一下午 //第一次用的DFS 还是感觉DFS思路清晰 //但…超时 问了老师 这种题一般都要用BFS 我昨天做的 走迷宫 那个题 应该是比较小 我用了DFS //这种题还是我第二次用BFS做呢 //现在我知道两个用BFS的模板了 其实和我昨天发的走迷宫真的是差不多 就是多了两个方向 套路一样 附上我在某位大侠那里看到的一个样例 输入 3 4 5 S . . . . . ### . . ## . . ### . # ##### ##### ## . ## ## . . . ##### ##### # . ### ####E 1 3 3 S## #E# ### 4 4 5 ##### ##### ## . ## ## . . . ##### ###S# # . # . # # . . . . ##### ##### # . ### ####E ##### # . . . # . . . ## # . . . . 1 2 2 ## SE 3 3 3 ### #E# # . # # . . . ## . # . . . . . . . . . S 5 2 2 ## ## # . . . . S . . . . . . . E . . 2 1 1 S E 1 1 2 SE 1 5 5 ##### S#### . . . . # ####E ## .

leetcode新年病房暴乱康复计划 46. 全排列 JS解法

不羁岁月 提交于 2020-01-30 23:26:27
/** * @param {number[]} nums * @return {number[][]} */ var permute = function(nums) { var ans = []; var vis = []; var res = []; var len = nums.length; function dfs(step){ if(step === len){ ans.push([...res]); return; } for(var i = 0; i < len; i++){ if(!vis[nums[i]]){ vis[nums[i]] = 1; res.push(nums[i]); dfs(step + 1); res.pop(); vis[nums[i]] = 0; } } } dfs(0); return ans; }; 这题经典dfs模板 有手就行 发出来主要是发现js数组类型的length调用时不太划算,需要使用多次时最好拉出来复制一下,这题没设len前运行时间为104ms,优化后80ms 来源: https://www.cnblogs.com/qq965921539/p/12244177.html

HZNU-ACM寒假集训Day3小结

最后都变了- 提交于 2020-01-30 20:57:15
简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据后序遍历找到根,然后在中序遍历中找到树根,从而找出左右子树的结点列表然后 递归 构造左右子树 3.注意这里输入的模板,用stringstream会方便 #include<iostream> #include<string> #include<cmath> #include<cstring> #include<vector> #include<map> #include<set> #include<algorithm> #include<queue> #include<stack> #include<sstream> #include<cstdio> #define INF 0x3f3f3f3f const int maxn = 1e6 + 5; const double PI = acos(-1.0); typedef long long ll; using namespace std; const int maxv = 10000 + 10; int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv]; int n; bool

3752:走迷宫 DFS和BFS

邮差的信 提交于 2020-01-30 05:35:52
我是先用DFS写的 因为我没用bfs写过这种题 后来想了想bfs也得练练 就看了别人的写了一遍 注释很详细 BFS //第一次接触这个形式的bfs 有时候感觉用dfs要简单 //以前做的bfs都是关于图的 B # include <iostream> # include <queue> # include <string> using namespace std ; int n , m ; string s [ 100 ] ; int vis [ 100 ] [ 100 ] ; //用结构体来搞 以后每一层都是上一层的走的步数加1 struct f { int x , y ; int js ; } ; //比较巧妙的是 上下左右 用了一个数组来搞 //一开始我想错了 想成了和8连通似的 int dir [ 4 ] [ 2 ] = { - 1 , 0 , 1 , 0 , 0 , - 1 , 0 , 1 } ; int bfs ( int x , int y ) { //t1当之前的 t2是正准备走的 //一个也行 这样可能好理解一点吧 f t1 , t2 ; //一开始默认步数是1 t1 . x = x , t1 . y = y , t1 . js = 1 ; vis [ x ] [ y ] = 1 ; queue < f > q ; q . push ( t1 ) ; while

Code[VS] 1332 题解 【Kosaraju】【Tarjan】

丶灬走出姿态 提交于 2020-01-29 17:26:54
Code[VS] 1332 上白泽慧音题解 Tarjan Algorithm Kosaraju Algorithm 题目传送门: http://codevs.cn/problem/1332/ 题目描述 Description 在幻想乡,上白泽慧音是以知识渊博闻名的老师。春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄。因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点。人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记。如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B)。当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>。绝对连通区域是指一个村庄的集合,在这个集合中任意两个村庄X,Y都满足<X,Y>。现在你的任务是,找出最大的绝对连通区域,并将这个绝对连通区域的村庄按编号依次输出。若存在两个最大的,输出字典序最小的,比如当存在1,3,4和2,5,6这两个最大连通区域时,输出的是1,3,4。 输入描述 Input Description 第1行:两个正整数N,M 第2..M+1行:每行三个正整数a,b,t, t = 1表示存在从村庄a到b的单向道路,t = 2表示村庄a,b之间存在双向通行的道路

POJ3074 Sudoku【dfs】

家住魔仙堡 提交于 2020-01-29 15:10:12
题目大意 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图中每行、每列、每个3 × 3的九宫格内数字1~9均恰好出现一次。 请编写一个程序填写数独。 思路 搜索边界分为两种: 1.是如果所有位置都被填满,就找到了一个解. 2. 如果发现某个位置没有能填的合法数字,说明当前分支搜索失败,应该回溯去尝试其他分支. 由于本题数据比较严格, 不能像 POJ2676 那样一个一个尝试,所以数据上需要做一些优化。 1.在搜索时, 优先搜索决策少的。 2.每行每列每个九宫格,分别用一个9位二进制数表示,保存还可以选择的数据。 3. 对于每个位置,把它所在行、列、九宫格的3个二进制数做位与(&)运算,就可以得到该位置能填哪些数,用lowbit运算就可以把能填的数字取出。 4. 修改状态. 5. dfs搜索. 6. 回溯. ones数组: 存每个数中有多少个1, 即是用来存当前这个格子有多少个可选择的决策,找出决策最少的格子然后进行深搜。 map数组 : 存某个数子的第一个1的下标, 即是取出这个二进制数的第一个1代表的可以放到格子里面的数字。 代码 # include <iostream> # include <cstring> # include <algorithm> # include <vector> # include <cstdio> using namespace

HDU1241 Oil Deposits(dfs+连通块问题)

醉酒当歌 提交于 2020-01-28 21:08:38
背景描述 ztw同志负责探测地下石油储藏.ztw现在在一块矩形区域探测石油.他通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石油的小方格相邻(横向相邻,纵向相邻,还有对角相邻),那么它们被认为是同一油藏的一部分.在这块矩形区域,可能有很多油藏.你的任务是确定有多少不同的油藏. 输入 输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m=0表示输入的结束,接下来是n行,每行m个字符.每个字符对应一个小方格,并且要么是‘*’、代表没有油,要么是‘@’,表示有油.(注意多组数据,必要的数组要及时清空~) 输出 对于每一个矩形区域,输出油藏的数量.两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。 示例输入 1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0 示例输出 0 1 2 2 代码: import java.util.Scanner; public class Main{ static int n,m,cnt; static final int N=105; static char map[][]=new char[N][N]; static int dx[]={0,0,1

无尽算法之 DFS+回溯算法 暴揍 leetcode.78 子集

删除回忆录丶 提交于 2020-01-28 07:37:14
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 分析: 例如: 输入 [1,2,3] 如果我们要计算子集 那么, 它的每个元素1, 2, 3 都有两种情况: 选择 和 不选择 , 所以直接递归回溯 注意 不选择的情况注意吧temp list 清空 再加上递归跳出条件 (索引不能越界) 搞定! 题解: class Solution { ArrayList results = new ArrayList ( ) ; public List < List < Integer > > subsets ( int [ ] nums ) { results . add ( new ArrayList ( ) ) ; Arrays . sort ( nums ) ; dfs ( new ArrayList ( ) , nums , 0 ) ; return results ; } public void dfs ( List < Integer > temp , int [ ] nums , int i ) { if ( i >= nums . length ) { return

(N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree

╄→尐↘猪︶ㄣ 提交于 2020-01-27 20:42:30
Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. For example, given a 3-ary tree: We should return its max depth, which is 3. Note: The depth of the tree is at most 1000 . The total number of nodes is at most 5000 . -------------------------------------------------------------------------------------------------------------------------------------- 这个和求二叉树的最大深度类似,只要掌握了二叉树的最大深度的解法以及理解了N叉树的原理,解决这个题就会很简单了。 递归/DFS: C++代码: /* // Definition for a Node. class Node { public: int val; vector

LeetCode——DFS

只谈情不闲聊 提交于 2020-01-27 09:42:56
岛屿问题 200.岛屿数量 (染色) 130.被围绕的区域 (染色边界岛屿,再遍历) 695.岛屿的最大面积 733.图像渲染 463.岛屿的周长 并查集 547.朋友圈 721.账户合并 684.冗余连接 494.目标和 回溯 491.递增子序列 473.火柴拼正方形 课程表 207.课程表 210.课程表II 其他 394.字符串解码 743.网络延迟时间 (Dijkstra) 934.最短的桥 (DFS+BFS) 01矩阵 (BFS) 785.判断二分图 133.克隆图 841.钥匙和房间 332.重新安排行程 979.在二叉树中分配硬币 638.大礼包 576.出界的路径数 417.太平洋大西洋水流问题 690.员工的重要性 546.移除盒子 (dp+DFS) 679.24点游戏 928.尽量减少恶意软件的传播II 329.矩阵中的最长递增路径 (记忆化深度优先搜索) 834.树中距离之和 488.祖玛游戏 839.相似字符串组 753.破解保险箱 301.删除无效的括号 514.自由之路 (记忆化DFS) 778.水位上升的泳池中游泳 968.监控二叉树 980.不同路径III 664.奇怪的打印机 99.恢复二叉搜索树 来源: CSDN 作者: K. Bob 链接: https://blog.csdn.net/ThreeAspects/article/details