dfs

[dfs][bfs][模拟] Jzoj P5769 引子

▼魔方 西西 提交于 2020-02-02 10:32:16
Description 网上冲浪时,Slavko被冲到了水箱里,水箱由上而下竖直平面。示意图如下: 数字i所在的矩形代表一个编号为i的水箱。 1号水箱为水箱中枢,有水管连出。除了1号水箱外,其他水箱上方会接进来恰好一条水管,也可能有水管连出。 连出的水管会从水箱侧面连出去,同一个水箱连出去的水管会在不同的行与侧面连接。每一条水管直接连接两个水箱,这意味着不会把水管分叉也不会出现水管交叉的情况。这样,从一个水箱流入另外一个水箱时,水管的走向始终保持行号增加或保持不变。 水会源源不断地涌进1号水箱直到各个水箱水满为止。帮助Slavko计算出各个水箱装满的次序。 Input 输入会给你一个n*m的点阵,点阵字符的全集为{+,|,-,.} 水箱:形状是矩形,四角有+符号,左右为|,上下为-,里面包含一个数字代表水箱的编号,如上图。 管道:一条管道恰好连接两个不同的水箱,|表示管道竖直摆放,- 表示管道水平摆放,其中竖直的管道之间会连接起来,水平的管道会连接起来,+连接竖直和水平的管道(+的上下恰好其中一个为.一个为|,+的左右恰好其中一个为 . 一个为-)。 其余位置用. 来填充。 输入的第1行为两个正整数n,m。 接下来n行描述点阵的信息,每行有m个字符。 Output 输出水箱被浸满的顺序,每行一个序号。 Sample Input Input 1 12 13 ..+--+.......

洛谷 P1242 新汉诺塔 dfs递归

寵の児 提交于 2020-02-02 08:13:43
洛谷 P1242 新汉诺塔 dfs递归 90分代码: 优先保证编号较大的到达目标位置,把其他编号较小的盘子都先移到中间柱子上。 # include <iostream> # include <algorithm> # include <stdio.h> # include <cmath> # include <queue> # include <cstring> # include <vector> # include <map> # define MAX 50 # define INF 0x3f3f3f3f typedef long long ll ; using namespace std ; //p1记录原始位置,p2记录目标位置 int n , p1 [ MAX ] , p2 [ MAX ] , ans = 0 ; void dfs ( int id , int pos1 , int pos2 ) { if ( pos1 == pos2 ) { //说明不需要转移 return ; } for ( int i = id - 1 ; i >= 1 ; i -- ) { //把所有比id小的圆盘移到中转柱上 dfs ( i , p1 [ i ] , 6 - pos1 - pos2 ) ; } p1 [ id ] = pos2 ; printf ( "move %d from

【数据结构】DFS

徘徊边缘 提交于 2020-02-02 05:46:48
【数据结构】深(广)度优先搜索 深度优先搜素代码示例: n件物品,每件物品重量为W[i],价值为c[i],选出若干物品放入容量为V的背包中,使价值之和最大 void DFS(int index,int sumW,int sumC){ //index为当前处理的物品编号 if(index==n){ //选了n件 if(sumW<=V && sumC>maxValue){ maxValue=sumC; } return; } DFS(index+1,sumW,sumC); DFS(index+1,sumW+w[index],sumC+c[index]); } //剪枝 void DFS(int index,int sumW,int sumC){ if(index==n) return; //已经完成对n件物品的选择; DFS(index+1,sumW,sumC); //不选第index件 if(sumW+W[index]<=V){ if(sumC+c[index]>ans){ ans=sumC+c[index]; //更新最大价值 } DFS(index+1,sumW+w[index],sumC+c[index]); //选第index件 } } 广度优先搜索模板: void BFS(){ queue<int> q; q.push(root); while(!q.empty()){

洛谷 P1378 油滴扩展 dfs搜索

青春壹個敷衍的年華 提交于 2020-02-02 04:58:23
洛谷 P1378 油滴扩展 dfs搜索 题解: dfs尝试所有的油滴放置顺序,找到总面积最大的一种。 代码如下: # include <iostream> # include <algorithm> # include <stdio.h> # include <cmath> # include <queue> # include <cstring> # include <vector> # include <map> # define MAX 10 # define PI 3.1415926 # define INF 0x3f3f3f3f typedef long long ll ; using namespace std ; int n , visit [ MAX ] ; double r [ MAX ] , x [ MAX ] , y [ MAX ] , xa , xb , ya , yb , maxl = 0.0 ; //r为每个油滴的半径,xa,xb,ya,yb为边界,maxl最油滴的最大总面积 double cal_r ( int i ) { //计算当前点油滴的半径 double dis1 = min ( fabs ( x [ i ] - xa ) , fabs ( x [ i ] - xb ) ) ; double dis2 = min ( fabs ( y [ i

A1090

你离开我真会死。 提交于 2020-02-02 04:10:48
A1079基于本题 读题不能有太强的代入感,要从题目中获取,不是自己想当然. the number of retailers that sell at the highest price:卖最高价格的零售商数目.(而不是卖最高价格的结点是哪一个) 本题的本质便是通过DFS获取到最大深度以及该深度的结点数. DFS : # include <cstdio> # include <cstdlib> # include <string.h> # include <math.h> # include <iostream> # include <vector> # include <set> # include <map> # include <stack> # include <queue> # include <string> # include <algorithm> using namespace std ; const int maxn = 100010 ; vector < int > child [ 100010 ] ; int final_layer = - 1 , num = 0 ; void DFS ( int root , int layer ) { if ( child [ root ] . size ( ) == 0 ) { if ( layer > final

《01迷宫》DFS加联通图

∥☆過路亽.° 提交于 2020-02-01 14:16:36
这个题目,虽然说是bfs题,但是显然dfs要简单一些。可能是本蒟蒻不会写bfs吧… 思路:可以发现,相邻的一块区域里的步数是一样的,就是这个联通图里的块总数,所以我们只需要dfs出这个联通图里的块总数,再把这个总数赋值给这个联通图里的所有点就可以了。 # include <bits/stdc++.h> using namespace std ; # define INF INT_MAX # define INM INT_MIN typedef long long LL ; typedef pair < int , int > pii ; const int N = 1e3 + 5 ; const int M = 1e6 + 5 ; string mp [ N ] ; int n , m , ans [ N ] [ N ] , sum , b [ 4 ] [ 2 ] = { 1 , 0 , - 1 , 0 , 0 , 1 , 0 , - 1 } , vis [ N ] [ N ] ; //ans存取结果 struct Node { int x , y ; } p [ M ] ; //结构体用来存一块联通图里的所有点,方便最后赋值 void dfs ( int x , int y , char z ) { sum ++ ; //开头就加,因为我们是在满足条件时才继续向下搜的

HDU-1312题解(DFS)

妖精的绣舞 提交于 2020-02-01 10:52:25
HDU-1312-DFS Written by Void-Walker 2020-02-01 09:09:25 1.题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1312 2.题目大意: 有一个矩形房间,房间里有红砖块(‘#’)和黑砖块(‘.’)组成。现在有一个人站在一个@上面,他只能走黑色方块,现在问他最多能经过多少黑色方块。(他的初始位置也算) 3.题目思路: 这道题是一个非常经典的深度优先搜索。我们从他的初始位置开始搜索: for(y=0;y<hy;y++) { for(x=0;x<wx;x++) { cin>>room[x][y]; if(room[x][y]=='@') { dx=x; dy=y; } } } 注意,认真读题,我们输入的两个尺寸参数第一个是数列,第二个才是横行,输入的时候要小心。之后,我们获得了初始位置就可以开始DFS了。 void DFS(int dx,int dy) { room[dx][dy]='#'; num++; for(int i=0;i<4;i++) { int newx=dx+dirx[i]; int newy=dy+diry[i]; if(CHECK(newx,newy) && room[newx][newy]=='.') { DFS(newx,newy); } } }

找素数(一些数任意组合,DFS)

回眸只為那壹抹淺笑 提交于 2020-02-01 09:22:53
素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除, 例如:2、3、5、97 等都是素数。2 是最小的素数。 现在,给你 n 个数字,请你从中选取一部分,用它们拼出一个最大的素数。 注意:某个数字出现多少次你就可以用多少次,6 与 9 不能混用。 样例 输入 3 2 7 9 样例输出 97 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 100000 + 5; 4 int vis[50]; 5 bool prime[N];//prime[i]表示i是不是质数 6 int p[N], tot;//p[N]用来存质数 7 int n,a[10]; 8 9 void init(){ 10 for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数 11 for(int i = 2; i < N; i++){ 12 if(prime[i]) p[tot ++] = i;//把质数存起来 13 for(int j = 0; j < tot && i * p[j] < N; j++){ 14 prime[i * p[j]] = false; 15 if(i % p[j] == 0) break;/

9.28noip模拟试题

本小妞迷上赌 提交于 2020-01-31 19:19:52
1、栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个 “完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,黄金大神让你必须只会水平或垂直地在X或Y轴上移动,你不能从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫: +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+ 如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。 PROGRAM NAME : maze INPUT FORMAT : (file maze.in) 第一行: W和H(用空格隔开) 第二行至第 2*H+1行: 每行2*W+1个字符表示迷宫 OUTPUT FORMAT : (file maze.out) 输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。

Trie树 + DFS - CSU 1457 Boggle

拈花ヽ惹草 提交于 2020-01-31 09:30:53
Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问。 每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串。 如果n个串中有对应的串和走出的字符串相同,那么需要求出: 1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少? 2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典序最小的。 3.n个串中总共出现了多少个串? analyse: Trie树+DFS. 一开始我是将矩阵的dfs串加入到Trie树中,然后用n个串来匹配树,各种TLE。 后来算了一下时间复杂度,很明显将n个串插入到Trie树中,再用矩阵的dfs串去匹配树,这样更优。 当然这样的话就要自己写字典序的比较函数,也很简单,其他地方没什么坑,写的时候细心一点就行。 Time complexity: O(N+M) Source code: /* * this code is made by crazyacking * Verdict: Accepted * Submission Date: 2015-08-27-13.27 * Time: 0MS * Memory: 137KB */ #include