dfs

【POJ - 1321】棋盘问题 (dfs)

孤者浪人 提交于 2020-02-04 01:16:36
棋盘问题 Descriptions: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 Input 输入含有多组测试数据。 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 当为-1 -1时表示输入结束。 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 Output 对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。 Sample Input 2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1 Sample Output 2 1 题目链接: https://vjudge.net/problem/POJ-1321 AC代码: #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include

POJ1207 水题

三世轮回 提交于 2020-02-03 22:50:50
思路: 其实很道路很水,显然如果增大的话是3的指数增大,所以即使n=10000,但是其实回归到1的时间也只是log的时间而已。 所以可以直接暴力打表。 写递归只是练习一下记忆化搜索。 感觉DFS的基础真是不扎实。 菜啊。 最恶心的是给的数据范围有可能是坐边数字大于右边。因此wa了好多次。。 #include<iostream> #define max(a,b) (a>b?a:b) using namespace std; const int N=10005; int data[N]; void dfs(int i,int k,int s) { if(i<N&&data[i]) { data[s]=data[i]+k; return; } if(i&1) { dfs(i*3+1,k+1,s); } else { dfs(i/2,k+1,s); } } int main() { data[1]=1; for(int i=1;i<N;i++) dfs(i,0,i); int l,r; while(scanf("%d%d",&l,&r)!=EOF) { printf("%d %d ",l,r); if(l>r) { int tmp=l; l=r; r=tmp; } int ans=0; for(int i=l;i<=r;i++) ans=max(ans,data[i]); printf("

nk 1207 &&poj 1011

旧巷老猫 提交于 2020-02-03 22:47:31
题目链接: http://acm.nankai.edu.cn/p1207.html 题目大意:给你n个数判断利用所给的数字长度是否可以组成正方形,对于一般不成立的数据可以根据长度之和是否为四的倍数,但满足这条件的也不一定是正方形,要进行四条边的判定,即dfs搜索每条边,只有四条边同时成立时才能说明成立,这里需要进行优化,由于和poj 1011相同故这里不再说明,见下文 。 View Code 1 #include <iostream> 2 #include <cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[25],v[25],w,n; 6 bool dfs(int num,int len,int pos) 7 { 8 int i; 9 bool sign=(len==0)?true:false;10 if(num==4)return true;11 for (i=pos+1;i<=n;i++)12 {13 if(!a[i]){14 if (len+v[i]==w)15 {16 a[i]=1;17 if(dfs(num+1,0,0))18 return true;19 a[i]=0;20 return false;21 }22 else if (len+v[i]<w)23 {24 a[i]=1;25 if(dfs

动态规划-Cherry Pickup

不羁岁月 提交于 2020-02-03 18:20:33
2020-02-03 17:46:04 问题描述 : 问题求解 : 非常好的题目,和two thumb其实非常类似,但是还是有个一点区别,就是本题要求最后要到达(n - 1, n - 1),只有到达了(n - 1, n - 1)才算是有效解,two thumb是一定会有解的,所以不用加特别判断。 也是一种路径规划类的题目,难点依然是状态的表示,我们这里使用的p1,p2的坐标位置作为状态。 另外,还需要注意的是在超界的时候,我们需要返回的是Integer.MIN_VALUE,这样就可以规避掉一些中间节点到不了终点的情况。 int[][][] dp = new int[51][51][51]; public int cherryPickup(int[][] grid) { int n = grid.length; for (int i = 0; i <= 50; i++) { for (int j = 0; j <= 50; j++) { Arrays.fill(dp[i][j], -1); } } int res = dfs(grid, 0, 0, 0); return dp[n - 1][n - 1][n - 1] == -1 ? 0 : res; } private int dfs(int[][] grid, int x1, int y1, int x2) { int n =

十六、图的遍历(深度,广度)

时光总嘲笑我的痴心妄想 提交于 2020-02-03 04:43:11
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。 第5步 :访问(A的邻接点)F。 前面已经访问了A,并且访问完了"A的邻接点B的所有邻接点

数据结构之DFS与BFS实现

六眼飞鱼酱① 提交于 2020-02-03 04:41:53
本文主要包括以下内容 邻接矩阵实现无向图的BFS与DFS 邻接表实现无向图的BFS与DFS 理论介绍 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为”宽度优先搜索”或”横向优先搜索”,简称BFS。 它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。 换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。 邻接矩阵实现无向图的BFS与DFS /** *

蓝桥杯剪格子dfs

拈花ヽ惹草 提交于 2020-02-02 20:26:24
#include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #include<bits/stdc++.h> using namespace std; int N, M; int num = INT_MAX, sum = 0; int A[10][10]; bool visit[10][10]; bool outOfBorder(int i, int j) { if (i < 0 || i >= N || j < 0 || j >= M) return true; return false; } void DFS(int i, int j, int currentSum, int currentNum) { visit[i][j] = true; currentSum += A[i][j]; ++currentNum; if (2 * currentSum >= sum) { if (2 * currentSum == sum)// 如果当前遍历过的数字之和等于所有数字之和的一半 num = min(currentNum, num);// 更新包含左上角格子的那个区域包含的格子的最小数目 visit[i][j] = false; return;// 回溯到上一结点

咸鱼的ACM之路:DFS做题记录

一曲冷凌霜 提交于 2020-02-02 19:30:19
DFS的核心就是从一种状态出发,转向任意的一个可行状态,直到达到结束条件为止。 洛谷 P1596 [USACO10OCT] 湖计数Lake Counting DFS入门题,求连通块的。 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int dx[8]={-1,-1,-1, 0, 0, 1,1,1};//方向 5 int dy[8]={-1, 0, 1,-1, 1,-1,0,1}; 6 char mapp[110][110];//地图 7 int n,m; 8 9 void dfs (int x,int y) 10 { 11 int nx,ny; 12 mapp[x][y]='.';//每进入一个状态就把这个点去掉,避免重复进入DFS 13 for (int i=0;i<8;i++) 14 { 15 nx=x+dx[i]; 16 ny=y+dy[i]; 17 if (nx<0||nx>=n||ny<0||ny>=m) 18 continue; 19 if (mapp[nx][ny]=='W')//如果‘.’也能走的话,那整块图都可以走了... 20 dfs(nx,ny);//进入到下一个状态 21 } 22 return ; 23 } 24 25 int main() 26 { 27 scanf

深度优先搜索(DFS)

◇◆丶佛笑我妖孽 提交于 2020-02-02 19:29:19
模板 int check(参数){ if(满足条件) return 1; return 0; } void DFS(int step){ 判断边界{ 相应操作 } 尝试每一种可能{ 满足check条件 标记 继续下一步 DFS(step + 1) 恢复初始状态(回溯的时候要用到) } } 来源: https://www.cnblogs.com/zjsaipplp/p/12253276.html

dfs+剪枝 poj1011

十年热恋 提交于 2020-02-02 14:19:49
  Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 113547 Accepted: 26078 问题描述   George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero. 输入格式   The input contains blocks of 2 lines. The first line contains the number of sticks