DFS(深度优先搜索算法)——Java实现(含例题)
基本概念
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。
沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(n!)。
回溯法
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
基本模版
int check(参数)
{if(满足条件)return 1;return 0;
}void dfs(int step)
{判断边界{相应操作}尝试每一种可能{满足check条件标记继续下一步dfs(step+1)恢复初始状态(回溯的时候要用到)}
}
水域大小
leetcode
你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。
示例:
输入:
[
[0,2,1,0],
[0,1,0,1],
[1,1,0,1],
[0,1,0,1]
]
输出: [1,2,4]
提示:
0 < len(land) <= 1000
0 < len(land[i]) <= 1000
class Solution {public int[] pondSizes(int[][] land) {List<Integer> list = new ArrayList<>();for (int i = 0; i < land.length; i++) {for (int j = 0; j < land[i].length; j++) {if (land[i][j] == 0) {list.add(dfs(land, i, j));}}}int[] arr = new int[list.size()];for (int i = 0; i < arr.length; i++) {arr[i] = list.get(i);}Arrays.sort(arr);return arr;}public int dfs(int[][] land, int i, int j) {if (i < 0 || j<0 || i>=land.length || j>=land[i].length || land[i][j] != 0) {return 0;}else {land[i][j] = 1;int count = 1;count += dfs(land, i+1, j);count += dfs(land, i-1, j);count += dfs(land, i, j+1);count += dfs(land, i, j-1);count += dfs(land, i-1, j-1);count += dfs(land, i-1, j+1);count += dfs(land, i+1, j-1);count += dfs(land, i+1, j+1);return count;} }
}
- 字符串的全排列
public static void permutation(char[] chars , int index , List<String> res) {if (index == chars.length - 1) {String string = new String(chars);res.add(string);}else {for (int i = index; i < chars.length; i++) {//去重if (isSwap(chars, index, i)) {swap(chars, index, i);permutation(chars, index+1, res);//回溯,恢复到初始状态swap(chars, index, i);}}}}public static boolean isSwap(char[] chars, int begin, int end) {for (int i = begin; i < end; i++) {if (chars[i] == chars[end]) {return false;}}return true;}public static void swap(char[] chars, int i, int j) {char temp = chars[j];chars[j] = chars[i];chars[i] = temp;}
- 带分数
题目:
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
11
样例输出1
14
样例输入2
105
样例输出2
6
static int n, res;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();sc.close();int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };getQuanpailie(data, 0);System.out.println(res);}/*** 得到三部分的十进制数* @param data* @param begin* @param end* @return*/public static int getNum(int[] data, int begin, int end) {int num = 0;for (int i = begin; i < end; i++) {num = num * 10 + data[i];}return num;}/*** 实现全排列后,分成三部分进行计算* @param data* @param k*/public static void getQuanpailie(int[] data, int k) {if (data.length - 1 == k) {//把全排列好的数,分成三部分,进行计算System.out.println(Arrays.toString(data));for (int i = 1; i < data.length; i++) {for (int j = i+1; j < data.length; j++) {int pre = getNum(data, 0, i);int mid = getNum(data, i, j);int fon = getNum(data, j, 9);if (mid % fon != 0) {continue;}if (pre + mid/fon == n) {res ++;}}}}else {//全排列for (int i = k; i < data.length; i++) {swap(data, k, i);getQuanpailie(data, k+1);swap(data, k, i);}}}public static void swap(int[] data, int i, int j) {int t = data[i];data[i] = data[j];data[j] = t;}
- 素环圈
环由N个圈组成,如图所示。将自然数1, 2、…、n分别放在每个圆中,两个相邻圆中的数字之和应该是素数。
注意:第一个圈的数字应该总是1。
输入:
n (0<n<20)
输出:
输出格式如下所示。每行代表环中的一系列圆数,从1顺时针和逆时针开始。数字的顺序必须满足上述要求。按词典顺序打印解决方案。
Sample Input:
6
Sample Output:
1 4 3 2 5 6
1 6 5 2 3 4
Sample Input:
8
Sample Output:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();sushuquan(n);}
public static void sushuquan(int n) {int[] data = new int[n];for (int i = 0; i < data.length; i++) {data[i] = i+1;}dfs(data, 1);}public static void dfs(int[] data, int index) {if (index == data.length -1) {boolean b = true;for (int i = 0; i < data.length-1; i++) {if (!isPrime(data[i]+data[i+1])) {b = false;}}if (b) {b = isPrime(data[0] +data[data.length -1]);}if (b) {for (int i = 0; i < data.length; i++) {System.out.print(data[i]);System.out.print(" ");}System.out.println();}}else {for (int i = index; i < data.length; i++) {swap(data, index, i);dfs(data, index+1);swap(data, index, i);}}}public static void swap(int[] data, int i, int j) {int t = data[i];data[i] = data[j];data[j] = t;}public static boolean isPrime(int num) {if (num <= 3) {return num > 1;}// 不在6的倍数两侧的一定不是质数, 在6的倍数两侧的不一定是质数, 比如25.if (num % 6 != 1 && num % 6 != 5) {return false;}int sqrt = (int) Math.sqrt(num);for (int i = 5; i <= sqrt; i += 6) {if (num % i == 0 || num % (i + 2) == 0) {return false;}}return true;}
DFS(深度优先搜索算法)——Java实现(含例题)相关推荐
- 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs
1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...
- 蓝桥杯Java——DFS深度优先搜索算法
目录 基本概念 算法思想 模板 例子 基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支 ...
- DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
深度优先搜索算法(DFS) 深度优先搜索算法思路:(有点贪心算法的意思) 1,从某个给定结点a出发,访问它 2,查找关于a的邻接点,查找到a的第一个邻接点b之后,对b结点进行DFS搜索,也就是对b结点 ...
- DFS(深度优先搜索算法)
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...
- opencv制作微信小游戏 最强连一连 辅助(2)--dfs深度优先搜索算法
深度优先搜索算法还是大二上数据结构的时候学的,工作以后都忘得差不多了.赶紧回来温习一下吧. 深度优先搜索的算法的 入参是一个地图(一般可以用二维数组表示)和一个起始点. 比如 这个就是一个5*5的二维 ...
- C语言 DFS(深度优先搜索算法) 详解
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...
- 详解ACM基础算法—DFS深度优先搜索算法 HIT杨朔
深度优先搜索(DFS)是搜索手段之一.是从某个状态开始不断转移状态直到无法转移为止,然后退回到前一步状态继续转移其他状态,可以想象为一个沿树爬行的虫子,在一个交叉口他会首先随机选择一条分岔路口一直走下 ...
- (6)DFS(深度优先搜索算法):n皇后问题
题解: 作者:yxc 链接:https://www.acwing.com/activity/content/code/content/47097/ 来源:AcWing 第一种搜索顺序 附代码: #in ...
- (5)DFS(深度优先搜索算法):排列数字
题解: 附代码: #include<iostream> using namespace std;const int N=10;int n; int path[N];//将每个节点的数据用数 ...
最新文章
- Juniper 重置设备到出厂缺省设置
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)...
- Jquery中实现表单提交前的校验
- 计算一个人出生了多少天(炸窝)
- Sublime Merge Stage时提示系统找不到指定的文件
- 匿名函数php作用,PHP匿名函数可以干什么用
- graphpad prism显著性差异分析_【市场表现】2020年第三季度企业债利差分析
- mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
- Richard Hamming - You and Your Research
- 简析平衡树(四)——FHQ Treap
- visio 绘图矢量图素材网站
- 计算机ip地址会变吗,电脑IP地址会变吗?
- vs code的php格式化
- CSDN线上竞赛第52期题解
- Python求两个或三个正整数的最大公约数和最小公倍数
- 3dMax夜晚行车灯光轨迹一键生成插件TrafficTrails使用教程
- 32 位 ARM® Cortex®-M0+内核 单片机
- 网站安全之XSS攻击
- 如何学Python?--捕蛇者说
- 山东省计算机等级考试初级试题,2013山东省计算机等级考试试题 二级ACCESS理论考试试题及答案...
热门文章
- 阿木动态 | 助力机器人教育!一站式智能无人机专业课程建设方案!
- 比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸
- 比 Elasticsearch 更快,RediSearch + RedisJSON = 王炸
- 印象笔记粘贴HTML,【未解决】Mac中从印象笔记中拷贝图片后去VSCode中用Paste Image无法粘贴图片:There is not a image in clipboard...
- 步进频雷达的一维距离像matlab仿真
- IEEE Access LaTex 版本问题(一):图片的标注无法换行、无法左对齐以及如何加粗
- Guide to Elliptic Curve Cryptography (ECC椭圆曲线算法1)
- Elliptic Labs推出虚拟智能存在检测传感解决方案,为低功耗笔记本电脑的安全性保驾护航
- 编程之法-C语言应用开发与工程实践-C语言概述
- C语言零基础学习日记