DFS(1)——hdu1518Square】的更多相关文章

一.题目回顾 题目链接:Square 题意:给你M根木棒,请判断这些木棒能否组成正方形. 二.解题思路 DFS+剪枝 [变量说明] sum:木棒的总长度 ave:形成的正方形的边长 maxlen:最长木棒的长度 [剪枝] “num%4!=0”:表示木棒的总长度不是4的倍数,那么不能形成正方形 “maxlen>ave”:表示最长木棒的长度大于“边长”,也不可能形成正方形 还有dfs语句内的剪枝,见下面分析. [搜索过程] dfs代码: void dfs(int num,int len,int st…
DFS定义 DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种.是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点 . 特点 每次深度优先搜索的结果必然是图的一个连通分量.深度优先搜索可以从多点发起.如果将每个节点在深度优先搜索过程中的"结束时间"排序(具体做法是创建一个list,然后在每个节点的相邻节点都已被访问的情况下,将该节点加入list结尾,然后逆转整个链表),则我们可以得到所谓的"拓扑排序",即topolo…
[日后练手](非解题) 拓扑排序+DFS(POJ1270) #include<stdio.h> #include<iostream> #include<cstdio> #include<queue> #include <vector> #include<map> #include<stack> #include<cmath> #include<cstring> #include<cstdlib…
采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新的结点,这个过程通常称为扩展.结点之间的关系一般可以表示成一棵树,它被称为解答树.搜索算法的搜索过程实际上就是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的结点的过程. 深度优先搜索DFS(Depth First Search)是从初始结点开始扩展,扩展顺序总是先扩展最新产生的结点.这就使…
  实例一  0/1背包问题:   有n件物品,每件物品的重量为w[i],价值为c[i].现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中的物品价值之和最大,求最大价值.(1<=n<=20)   /** * Copyright(c) * All rights reserved. * Author : Mered1th * Date : 2019-02-20-13.12.15 * Description : Bag */ #include&…
(一)深度优先搜索(DFS) 我们先给出深度优先的解决办法,所谓深度优先搜索,在迷宫问题里就是不撞南墙不回头,能走得深一点就尽量深一点.如果碰到了墙壁就返回前一个位置尝试其他的方向.在<啊哈!算法>中作者给出了一个深度优先搜索的基本模型,笔者认为比较贴切. 基本框架: void dfs(int step) { 判断边界 尝试每一种可能 ;i<n;i++) { 继续下一步 dfs(step+); } 返回 return; } 例:最简单的DFS——全排列(全排列是啥,请自行度娘) 输入n,…
在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次.例如,下图给出了骑士从坐标(1,5)出发,游历棋盘的一种可能情况. [例1]骑士游历问题. 编写一个程序,对于给定的起始位置(x0,y0),探索出一条路径,沿着这条路径骑士能遍历棋盘上的所有单元格. (1)编程思路. 采用深度优先搜索进行路径的探索.深度优先搜索用递归描述的一般框架为: void dfs(int deep) // 对deep层进行搜索 { if (符合某种要…
顾名思义,剪枝就是通过一些判断,剪掉搜索树上不必要的子树.在采用DFS算法搜索时,有时候我们会发现某个结点对应的子树的状态都不是我们要的结果,这时候我们没必要对这个分支进行搜索,砍掉这个子树,就是剪枝.      在DFS搜索算法中,剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径.应用剪枝策略的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法. 剪枝策略按照其判断思路可大致分成两类:可行性剪枝及最优性剪枝.   1.可行性剪枝 可行性剪枝就是把能够想到的不可能出现的…
[例1]八皇后问题. 在一个8×8国际象棋盘上,放置8个皇后,每个皇后占一格,要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行.同一列或同一对角线上.问共有多少种不同的放置方法? (1)编程思路. 在八皇后问题中,由于任意两个皇后不同行,因此可以将布局表示为一维数组chess[8].数组的下标i表示棋盘上的第i行,chess[i]的值表示皇后在第i行所放的位置.如chess[1]=5,表示在棋盘的第1行的第5列放一个皇后. 为了寻找满足要求的布局chess,可依次产生部分布局(c…
题目描述 已知 n 个整数b1,b2,…,bn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. 输入 第一行两个整数:n , k (1<=n<=20,k<n) 第二行n个…
一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到一定火候将会TLE,只有完成一定的剪枝才能AC 本题,我将从我做这题的角度,将所思所想具体记录下来,详细的官版思想见我另一个题解. 首先,看main函数: int main() { while(scanf("%d",&n) && n){ int sum=0; for…
一.题目回顾 题目链接:Oil Deposits 题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田.已知一块油田与它上下左右以及对角线的油田同属一片油区,请问总共有多少油区. 二.解题思路 DFS经典 注意的就是要向八个方向搜索,搜索完一处,将该处变成石头(另一种标记) 答案变量在主函数内改变,而不在dfs函数内 三.代码 #include<iostream> #include<cstdio> #include<algorith…
一.题目回顾 题目链接:棋盘问题 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形…
一.题目回顾 题目链接:逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,…
一.题目回顾 题目链接:Tempter of the Bone Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bon…
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried despe…
问题描述 使用两种砖头砌墙,砖头A宽为2,高为1,砖头B宽为3,高为1,用这两种砖头砌一面宽为W,高为H的墙. 为了使墙牢固性高,要求每种砖只能横向摆放,不能竖起来,且除了两侧以外,不能出现上下对齐的砖缝,请参考下图:        上图允许 上图不允许 下图展示了宽为13,高为5的墙的一种砌法 对于给定的宽度W,高度H,请问有多少种砌法? 解决方案 该问题可以转化为搜索问题,使用深度优先搜索即可解决. 具体思路是:将墙转化为2维平面坐标系,使用二维字符数组记录砖缝的位置,放置砖块时,判断是否可…
总结下图里面的常用模板: DFS(u){ vis[u]=true; for(从u出发能到达的所有顶点v){ if(vis[v]==false){ DFS(v); } } } DFSTrave(G){ for(G的所有顶点u){ if(vis[u]==false){ DFS(u); } } } 1.邻接矩阵版 int n,G[maxv][maxv]; //n为顶点数 bool vis[maxv]={false}; void DFS(int u,int depth){ vis[u]=true; ;v…
添柴网这题好想不能评测,所以不确保代码的正确性 题目描述: 这小节有点难,看不太懂可以跳过哦.最近小哼又迷上一个叫做水管工的游戏.游戏的大致规则是这样的.一块矩形土地被分为N * M的单位正方形,现在这块土地上已经埋设有一些水管,水管将从坐标为(1,1)左上角左部边缘,延伸到(N,M)右下角右部边缘.水管只有2种,如下图所示.每种管道将占据一个单位正方形土地.你现在可以旋转这些管道,使得构成一个管道系统,即创造一条从(1,1)到(N,M)的连通管道.标有树木的方格表示这里没有管道.如下图:一个4…
递归 + 标记 一个连通图只要DFS一次,即可打印所有的点. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <malloc.h> using namespace std; const int VERTEX_NUM = 20; const int INFINITY = 0x7fffffff; // 最大int型数,表示权的无限…
一.题目回顾 题目链接:Anti-prime Sequences Sample Input 1 10 2 1 10 3 1 10 5 40 60 7 0 0 0   Sample Output 1,3,5,4,2,6,9,7,8,10 1,3,5,4,6,2,10,8,7,9 No anti-prime sequence exists. 40,41,43,42,44,46,45,47,48,50,55,53,52,60,56,49,51,59,58,57,54 题意:求n到m的一个排列,满足任意…
一.题目回顾 题目链接:Lotto Sample Input 7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0 Sample Output 1 2 3 4 5 6 1 2 3 4 5 7 1 2 3 4 6 7 1 2 3 5 6 7 1 2 4 5 6 7 1 3 4 5 6 7 2 3 4 5 6 7 1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1…
http://codeforces.com/gym/100989/problem/L L. Plus or Minus (A) time limit per test 1.0 s memory limit per test 256 MB input standard input output standard output AbdelKader enjoys math. He feels very frustrated whenever he sees an incorrect equation…
问题 J: 棋盘行走 时间限制: 1 Sec  内存限制: 128 MB[命题人:admin] 题目描述 小Biu在玩一个棋盘游戏,这个游戏给出一个n*m的棋盘,并且每个点上有一个棋子,棋子的颜色 用一个大写字母表示. 小Biu获得游戏胜利的条件是: 1.选择一个棋子作为起点. 2.每次只能走上下左右四个方格,并且下一步方格的颜色要与当前格颜色相同 3.每个块只能经过一次,要经过不少于4个不同的格子而且最终要走回起点. 问小Biu是否可以赢得游戏的胜利 输入 第一行包含两个整数n和m (2≤n,…
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1.假设我们以顶点0为原点进行搜索,首先确定邻接0的顶点集合S0 = {1,2}. 2.然后确定顶点1的集合S1 = {3},顶点2没有邻接点,所以集合为空. 3.然后确定3的邻接点集合S3,因为2已经被遍历过,所以不考虑,所以由顶点3知道的邻接点集合S3 = {4}. 4.然后再确定顶点4的邻接点集…
内容总结 自<啊哈!算法!> 作为一个都大二的了一个菜鸡,做题的时候DFS怎么可以不会呢!!! 作为一个都大二了的(!!!)菜鸡....<啊哈算法>这本书第四章的搜索,开始那里我就没看懂,就跑来看第五章了.结果这个理解起来方便一些....总结摘抄一下给远方的不知名网友and for myself. 以下语言有不严谨之处请多包涵,先理解重要. 深度搜索算法,就是对于一个图(图自己瞎画的  太丑)  如下图所示,给这些圆圈标号. 然后我们遍历的时候,是“优先深度” ,先从一条路走到黑走…
A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components Analysis, February 26, 2002. 翻译:houchaoqun.时间:2017/01/18.出处:http://blog.csdn.net/houchaoqun_xmu  |  http://blog.csdn.net/Houchaoqun_XMU/article/details…
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之:反之,退回到最近访问过的顶点:直到与起始顶点相通的全部顶点都访问完毕: 3.若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2: 反之,遍历结束. 连通图的深度优先遍历类似于树的先根遍历 如何判别V的邻接点是否被访问? 解决办法:为每个顶点设立一个“访问标志”…
题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不同的颜色 思路: 和2012年多校第7场的G题是同类题,DFS序处理出每个节点管辖的管辖范围[L[u], R[u]],其中L[u]就是子树根节点u所在的位置,用线段树成端更新颜色变化,注意到颜色(<=60),可以用bitset<60>,0表示没有这个颜色,1表示有,异或就能区间合并,最后co…
题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n个数,必定为分成两个位数分别为n/2和n-n/2的数时才可能取得差的绝对值最小.两组数分别进行全排列比较大小,这样比较次数最大为(10A5)*(5A5)=10!,在可以接受的范围内. 参考代码: #include<stdio.h> #include<cstring> #include…