DFS
来源:互联网 发布:西湖金座大酒店桑拿js 编辑:程序博客网 时间:2024/05/01 02:49
DFS(深度优先搜索),一条路搜到底,不撞南墙不回头,一般用于判断给定一些元素能否得到结果,和BFS刚好相对,有一个隐式的栈,需要用递归实现。
题目:
给定n个元素,这些元素相加(每个元素最多用一次),能得到k吗?
核心代码:
bool dfs(int i, int sum){if(i == n)return sum == k;//加不加的情况都遍历一下 if(dfs(i + 1, sum))return true;if(dfs(i + 1, sum + v[i]))return true;return false;}这个题也可以用dp来做。
题目:
hdoj : http://acm.hdu.edu.cn/showproblem.php?pid=1016
思路:建一个数组用来存每一步的结果,因为是递归,可以每次截取一段这个数组,因为结果共享这个数组的一段,也就是从结果回到分支处,再走向下一个分支。
AC代码:
#include<iostream>using namespace std;int n, nums[30];void print(int str[]){ printf("%d", str[0]); for(int i = 1; i < n; i++) printf(" %d", str[i]); printf("\n");}bool find(int a, int b){ for(int i = 1; i < a; i++) if(b == nums[i]) return true; return false;}bool isPrime(int a){ for(int i = 2; i * i <= a; i++) if(!(a % i)) return false; return true;}void dfs(int a){ if(a == n) { if(isPrime(nums[a - 1] + 1)) print(nums); } else for(int i = 2; i <= n; i++) if(!find(a, i) && isPrime(i + nums[a - 1]))//在数组0到a - 1的位置寻找是否有i这个元素,如果没有并且i + a - 1是素数,就将i加到数组上 { nums[a] = i; dfs(a + 1); }}main(){ int cnt = 1; nums[0] = 1; while(~scanf("%d", &n)) { printf("Case %d:\n", cnt++); dfs(1); printf("\n"); }}
0 0
- DFS
- DFS
- dfs
- dfs
- dfs
- dfs
- DFS
- DFS
- dfs
- DFS
- DFS
- DFS
- dfs
- DFS
- dfs
- dfs
- dfs
- dfs
- WebService到底是什么? .
- 圆形进度对话框
- Android学习小Demo(14)Android中关于PopupWindow的使用
- Java基础知识8
- UVA 12223 - Moving to Nuremberg(树形DP)
- DFS
- HttpServlet
- 小小的你
- 功能丰富的 Perl: 用 Perl 读写 Excel 文件
- 使用BBB的device tree和cape(重新整理版)
- 使用jquery做datepicker
- poj 3320 Jessica's Reading Problem
- 常量指针和指针常量
- UID-排版常用HTML标签