深度优先算法学习 案例
来源:互联网 发布:淘宝衣服纯色背景 编辑:程序博客网 时间:2024/06/05 04:31
【挑战程序设计竞赛第二版 巫泽俊】
1.部分和问题
给定整数a1、a2、…、an,判断是否可以从中选出若干数,使他们的和恰好为k。
限制条件:
题解:利用深度优先算法,分情况计算下去,递归。
样例
输入:
n=4
a={1,2,4,7}
k=15
输出:
No
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h> int a[100000001]; int 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+a[i])) return true; return false;}int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&k); if(dfs(0,0)) printf("yes\n"); else printf("no \n");}
2.Lake Counting(POJ No.2386)
有一个大小为N*M的园子,雨后积起了。八连通的积水被认为是连接在一起的,试求园子里总共有多少水洼。(八连通指的是下图中相对W的*的部分)
限制条件
题解:因为要计算水洼的数量,而且连接在一起的积水算为一个,因此可以利用深度优先,将连接在一起的都一起标记出来,且出去四周,都有8个方向,两个for循环即可实现。
void dfs(int x,int y){ a[x][y]='.'; for(int dx=-1;dx<=1;dx++) for(int dy=-1;dy<=1;dy++){ int nx=x+dx; int ny=y+dy; if(0<=nx&&nx<n&&0<=ny&&ny<m&&a[nx][ny]=='w') dfs(nx,ny); } return ;}void solve(){ int sum=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(a[n][m]=='w'){ dfs(i,j); sum++; } printf("%d\n",sum);}
总结:深度优先算法可以用在挺多方面的,感觉最主要的还是递归的时候,将一个个情况都列举出来。
0 0
- 深度优先算法学习 案例
- 算法学习:看看深度优先搜索算法
- java学习深度优先算法(未测试)
- 【算法学习】二、深度优先搜索与广度优先搜索
- 算法学习(2):BFS/DFS-广度优先/深度优先
- 深度学习之k-近邻算法案例
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- dfs深度优先算法
- 【深度优先搜索算法】
- C# 深度优先算法
- 深度优先搜索算法
- 深度优先算法 -- 冰壶
- 深度优先搜索算法
- 文本形式 、二进制形式保存π
- WebService接口开发
- linux xxx/xx: 只读文件系统
- Java IO字符流常见类进行分析(四)
- 设计模式 适配器模式 以手机充电器为例
- 深度优先算法学习 案例
- 了解linux的目录结构(ubuntu)
- angularJS+requireJS实现controller及directive的按需加载
- EularProject 99:Largest exponential
- Android添加硬件访问服务
- Android app 飞花令
- Android 闹钟以及通知
- python 多线程学习记录
- 王道机试指南读后总结-1