dfs

HDU 2553 N皇后问题(DFS)

Deadly 提交于 2020-02-28 14:04:42
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5171 Accepted Submission(s): 2357 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。 Sample Input 1 8 5 0 Sample Output 1 92 10 Author cgf Source 2008 HZNU Programming Contest Recommend lcy 搜索水题。。。。不过这题得打表,如果每次都搜索的话会超时。。。 By LFENG #include <stdio.h> int s[ 12 ] = { 0 , 1 , 0 , 0 , 2 ,

POJ-2561 Network Saboteur(DFS)

随声附和 提交于 2020-02-28 10:05:02
题目: A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully divided the network into two subnetworks in order to minimize traffic between parts. A disgruntled computer science student Vasya, after being expelled from the university, decided to have his revenge. He hacked into the university network and decided to reassign computers to maximize the traffic between two subnetworks. Unfortunately, he found that calculating such worst subdivision is one of those problems he, being a student, failed to solve. So he asks

迷宫问题(dfs)

喜欢而已 提交于 2020-02-28 00:50:52
问题 1672: 迷宫问题 时间限制: 1Sec 内存限制: 32MB 题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点有多少种走法。 小明只能向上下左右四个方向移动。 输入 输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。 每组输入的第一行是两个整数N和M(1<=N,M<=100)。 接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。 字符的含义如下: ‘s’:起点 ‘e’:终点 ‘-.:空地,可以通过 ‘#’:障碍,无法通过 输入数据保证有且仅有一个起点和终点。 输出 对于每组输入,输出多少中走法,如果不存在从起点到终点的路,则输出-1。 样例输入: 样例输出: 1 分析:利用深搜统计即可 # include <cstdio> # include <string> # include <iostream> using namespace std ; int m , n ; int ans = 0 ; //记录次数 bool vis [ 1005 ] [ 1005 ] ; int dir [ 4 ] [ 2 ] { { - 1 , 0 } , { 0 , - 1 } , { 1 , 0 } , { 0 , 1 } } ; string mp [ 1005 ] ; bool in ( int x , int y ) { return x >=

刷题笔记-图-图的遍历

让人想犯罪 __ 提交于 2020-02-27 11:27:23
目录 深度优先遍历(DFS) 邻接表(DFS) 邻接矩阵(DFS) 广度优先遍历(BFS) 邻接表(BFS 无层级统计) 邻接表(BFS 含层级统计) 邻接矩阵(BFS 无层级统计) 邻接矩阵(BFS 含层级统计) 深度优先遍历(DFS) 邻接表(DFS) #include <iostream> #include <vector> using namespace std; const int maxn=10; vector<int> g[maxn]; int n,vis[maxn]; void dfs(int v, int h) { vis[v]=1; // 层级相关处理,或者对当前访问顶点的处理 for(int i=0; i<g[v].size(); i++) { if(vis[g[v][i]]==0) { dfs(g[v][i],h+1); } } } void dfs_travel() { for(int i=0; i<n; i++) { if(vis[i]==0) { dfs(i,1); //起始高度假设为1 // 统计连通分量 } } } int main(int argc,char * argv[]) { scanf("%d",&n); int a,b; for(int i=0;i<n;i++){ scanf("%d %d",&a,&b); g[a].push_back

斐波那契变形 2013蓝桥杯C/C++ B组3 第39级台阶

為{幸葍}努か 提交于 2020-02-27 08:46:21
题面 现有39级台阶 一次只能迈出1、2步,并要求总步数为偶数 求一共有多少种走法 dfs # include <bits/stdc++.h> using namespace std ; const int maxn = 39 ; int deta [ 2 ] = { 1 , 2 } ; int num = 0 ; void dfs ( int floor , int step ) { if ( floor == maxn ) { if ( step % 2 == 0 ) { num ++ ; } return ; } if ( floor > maxn ) { return ; } for ( int i = 0 ; i < 2 ; i ++ ) { int dx = floor + deta [ i ] ; dfs ( dx , step + 1 ) ; } } int main ( ) { dfs ( 0 , 0 ) ; cout << num ; return 0 ; } 递推 bfs 洛谷相似题 台阶问题 注 用dfs搜索不失为一种万金油方法,数据规模为2^39~10e12 掌握递推思想更重要 答案51167078 斐波那契问题很重要,dp思想 来源: CSDN 作者: GOD_Dian 链接: https://blog.csdn.net/qq_39685968

DFS之搜索顺序------单词接龙

倾然丶 夕夏残阳落幕 提交于 2020-02-27 03:54:13
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。 # include <iostream> # include <algorithm> # include <cstring> using namespace std ; const int N = 21 ; int n ; string word [ N ] ; int g [ N ] [ N ] ; int used [ N ] ; int ans ; void dfs ( string dragon , int last ) { ans = max ( ( int ) dragon . size ( ) , ans ) ; used [ last ] ++ ; for ( int i = 0 ; i < n ; i ++ ) if ( g [ last ] [ i ] && used [ i ] < 2 ) dfs ( dragon + word [ i ] . substr ( g [ last ] [ i ] ) , i

sicily 1801 Reading books【DFS】

荒凉一梦 提交于 2020-02-27 02:09:57
  根据关系构图:相似的两本书之间有一条双向边。然后利用dfs找出每个连通块,除了这个连通块中耗时最小的一本书要用原来的时间读完,其他的书只要一半时间就可以读完,直到全部连通块处理完便可找到答案。   搜索永远是那么得迷人。。。。 View Code #include <iostream>#include <cstring>#include <vector>using namespace std;const int MAX = 105;vector<int> vec[MAX];int n,m,tim[MAX],_min,temp[MAX],len,root;bool vis[MAX];void dfs(int k) //dfs找连通块{ /*找耗时最小的书本*/ if(tim[k] < _min) {_min = tim[k]; root = k;} temp[len++] = k; vis[k] = true; for(int i = 0;i < vec[k].size();++i) { if(!vis[vec[k][i]]) dfs(vec[k][i]); }}int main(){ int i,u,v; while(cin>>n>>m) { if(n == 0 && m == 0) break; for(i = 0;i < n;++i) cin>>tim[i]; for(i

数据结构-图和图遍历(DFS、BFS)

ⅰ亾dé卋堺 提交于 2020-02-26 20:13:45
一、图的定义和相关术语 图是由顶点(Vertex)和边(Edge) 图可以分为有向图和无向图,无向图所有边都是双边的 顶点的度是指该顶点相连的边的条数,特别是对于有向图的边数称为顶点的出度,顶点的入边条数称为该顶点的入度。 顶点和边都可以有一定的属性,量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。 二、图的存储 一般图来说存储方式有两种: 邻接矩阵 和 邻接表 邻接矩阵 ,本质上是一个二维数组,里面可以存放权值,但是是开辟了一个二维数组,不能够开辟很大的,一般的结点数不能超过 1000 。 邻接表 , N个顶点就会有N个列表,常常使用vector来实现邻接表。 vector<int> Adj[N]; Adj[1].push_back(3); struct Node{ int v; int w; }; vector<Node> Adj[N]; //如果想添加边 Node temp; temp.v = 3; temp.w = 4; Adj[1].push_back(temp); //更快的方式,用定义结构体Node时构造函数 struct Node{ int v, w; Node(int _v, int _w) : v(_v), w(_w) {} } //这样就可以不用定义临时变量 Adj[1].push_back(Node(3, 4)); 三、图的遍历

DFS-八皇后 Checker Challenge

廉价感情. 提交于 2020-02-26 15:55:53
设4个数组: a[i]表示第i行的纵坐标为多少 b[i]表示第i列有没有被占用,1占用,0,没占用 c[i]记录左下到右上的对角线:我们可以发现,如果两个点都在左下到右上的线上,那么他们的横、纵坐标相加的值相等; d[i]记录右下到左上的对角线:我们可以发现,如果两个点都在右下到左上的线上,那么他们的横、纵坐标相减的值相等,但有可能是负数,所以我们偏移n 这样设4个数组,我们每次判断即可,不用再循环一次了。 import java . util . Scanner ; public class 八黄后 { static int sum , n ; static int a [ ] = new int [ 30 ] ; static int b [ ] = new int [ 30 ] ; static int c [ ] = new int [ 30 ] ; static int d [ ] = new int [ 30 ] ; static void dfs ( int h ) { if ( h == n + 1 ) { sum ++ ; if ( sum <= 3 ) { for ( int i = 1 ; i < n ; i ++ ) { System . out . print ( a [ i ] + " " ) ; } System . out . print ( a [

2.25总结

谁说胖子不能爱 提交于 2020-02-26 03:00:33
A.第Q个全排列 开始暴力dfs莽了两发超时没过,然后算了一下9!365000左右,1到9的阶层总共450000左右,运算量在400万,然后dfs暴力打表,输入输出。 G.LZY的计算器 开始以为是搜索,就直接莽了,然后发现有规律 J: 水流问题 思路就是对的,因为忘了初始化,wa几次 K: 吃鸡路线 主要以为起点终点一定会在路线里出现就一直wa,中途又以为是单向路交了几次,其他没什么坑点了。 H: 弹药数量 上次牛客上遇到过类似的题,所以开始就感觉是线段树,但又不会建树,就一直放在哪里,最后用数组模拟了一下,觉得查询单点没必要,就判i是否等于j,赛后才看i可以等于j才过了,然后cin超时了,改scanf过的。 前面感觉自己能追上去就没怎么在意罚时,后面又因为题数上暂时领先,就一直莽,总的来说,就是太莽了。 来源: CSDN 作者: yezhuyuan 链接: https://blog.csdn.net/yezhuyuan/article/details/104505851