算法---深度优先搜索
来源:互联网 发布:怎么减少网络延迟 编辑:程序博客网 时间:2024/06/11 07:11
搜索的基本框架:
void dfs(int step) { //判断结束条件 //尝试每一种可能 for(::) { //继续下一步 dfs(step+1); //收回 } //返回}
以四位全排列(1234组成的所有组合)为例:
#include<stdio.h>int n,a[10],book[10];void dfs(int step) { int i; //判断结束条件(当step到了n+1的时候结束) if(step == n+1) { for(i=1; i<=n; i++) { printf("%d", a[i]); } printf("\n"); } //遍历所有可能 for(i=1; i<=n; i++) { //判断i是否已经走了 if(book[i] == 0) { //i还没走就放进a数组中 a[step] = i; //因为i已经放进a数组,所有标记1把i标记为走了 book[i] = 1; //下一步 dfs(step+1); //收回 book[i] = 0; } }}int main() { scanf("%d",&n); dfs(1); return 0;}
NYOJ 1058 部分和问题(经典题目dfs)
部分和问题
描述
给定整数a1、a2、…….an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
样例输入
4 13
1 2 4 7
样例输出
2 4 7
#include<stdio.h>int n, k, sum=0;//a用来存放数据,book用来做标记int a[10],book[10];void dfs(int step) { //判断结束条件 //当sum>=k的时候进行判断,如果sum==k则可以输出,如果sum>k就可以结束 if(sum >= k) { if(sum == k) { for(int i=0; i<n; i++) { // if(book[i]==1) printf("%d ", a[i]); } printf("\n"); }} //遍历所有可能 for(int i=step; i<n; i++) { sum += a[i]; //把数据加入到sum book[i] = 1; //标记这个数据已经加入了 dfs(i+1); //记得回收 sum -= a[i]; book[i] = 0; }}int main() { while(scanf("%d %d", &n, &k) == 2) { for(int i=0; i<n; i++) { scanf("%d", &a[i]); } dfs(0); } return 0;}
迷宫搜索
测试代码:
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
在坐标(1,1)走到(4,3)最短路径
#include<stdio.h> int p,q,n,m,min=999;int book[50][50],a[50][50];void dfs(int x, int y, int step) { int tx, ty, k; //下一个坐标next,下一步就四种走法,上下左右。 int next[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}}; //判断结束条件 if(x==p && y==q) { if(step < min) { min = step; } } //遍历所有可能,因为一个坐标到另一个坐标只有上下左右四种走法 for(k=0; k<=3; k++) { //可以遍历上下左右 tx = x + next[k][0]; ty = y + next[k][1]; //判断是否越界,如果越界就跳过这个,继续下一个 if(tx>n || ty>m || tx<1 || ty<1) { continue; } //判断是否有障碍点,和判断是否走过 if(a[tx][ty]==0 && book[tx][ty]==0) { //标记这个点已经走过 book[tx][ty] = 1; //下一个,继续递归 dfs(tx, ty, step+1); //记得收回 book[tx][ty] = 0; } }}int main() { int startx, starty; //输入迷宫行列 scanf("%d %d", &n, &m); //输入迷宫 for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%d", &a[i][j]); } } //输入起始坐标和目的坐标 scanf("%d %d %d %d", &startx, &starty, &p, &q); //标记起始坐标 book[startx][starty] = 1; //dfs搜索 dfs(startx, starty, 0); //输出最小值 printf("%d", min); return 0;}
输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
得到最短路径:7
0 0
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 【深度优先搜索算法】
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 算法---深度优先搜索
- 【算法】深度优先搜索
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索 广度优先搜索算法
- [ 算法 ] 深度优先搜索算法!
- 深度优先搜索(DFS)算法
- 算法 DFS深度优先搜索
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)
- 关于推送的一些知识(1)
- 8.shell编程(8) --- 编程基本元素
- ACM 头文件
- DES的加密解密
- 算法---深度优先搜索
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- UVALive 3695 (博弈 bfs)
- Linux中vim命令和cat命令的区别
- SQL Server数据库查询速度慢原因及优化方法
- ArrrayList 和 LinkedList 查询效率区别举例说明
- yum源不存在解决方法
- java回忆录—输入输出流详细讲解(入门经典)
- 多项式求解(霍纳规则(Horner Rule))