JAVA 算法 回溯
用于求最优解、一组解、求全部解这类问题
从问题的某一种可能出发,搜索从这种情况出发所能达到的所有可能,如果有路可以走下去,就走到下一个状态,继续按照这种规则搜索;当这条路走到“尽头”而没有达到目标状态的时候,在倒回上一个出发点,从另一个可能出发,继续搜索,直到达到目标状态。
回溯与递归的区别
递归是一种算法结构,递归会出现在子程序中自己调用自己或间接地自己调用自己。
回溯是一种算法思想, 从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到” 尽头 “的时候, 再倒回出发点, 从另一个可能出发, 继续搜索. 这种不断” 回溯 “寻找解的方法。
通俗点讲回溯就是一种试探,类似于穷举,但回溯有“剪枝”功能,比如求和问题。给定7个数字,1 2 3 4 5 6 7求和等于7的组合,从小到大搜索,选择1+2+3+4 =10>7,已经超过了7,之后的5 6 7就没必要在继续了,这就是一种搜索过程的优化。
原文链接
走迷宫问题
给一迷宫表个和入口位置,找出并打印出从入口到出口的路径
public class Zoumigong {public static void main(String[] args) {//小球从(1,1)出发,到达(6,5)结束//值为0表示没走过,值为2表示通路,值为3表示走过(测试过),但是不通//在走迷宫时,尝试方向 下右上左,走不通,则回溯int[][] map=new int[8][7];migong(map);for (int[] ints : map) {for (int anInt : ints) {System.out.print(" "+anInt);}System.out.println();}setWay(map,1,1);System.out.println("走出之后的");for (int[] ints : map) {for (int anInt : ints) {System.out.print(" "+anInt);}System.out.println();}}//生成地图public static void migong(int[][] map){//用1当墙for (int i = 0; i < 7; i++) {map[0][i]=1;map[7][i]=1;}for (int i = 0; i < 8; i++) {map[i][6]=1;map[i][0]=1;}//设置挡板map[3][1]=1;map[3][2]=1;}//寻求出路 下右上左public static boolean setWay(int[][] map,int i,int j){if (map[6][5]==2){//找到出路return true;}else {if(map[i][j]==0){map[i][j]=2;//假设为通路上一点//按照下右上左开始尝试if (setWay(map, i+1,j)){return true;}else if (setWay(map, i,j+1)){return true;}else if (setWay(map, i-1,j)){return true;}else if (setWay(map, i,j-1)){return true;}else{//说明该点不通map[i][j]=3;return false;}}else {//该点为1,2,3return false;}}}
}
八皇后问题
8x8的棋盘 有八个皇后 要求任意两个皇后都不能处于同一行,同一列或同一斜线上,有多少种解法
//8x8的棋盘 有八个皇后 要求任意两个皇后都不能处于同一行,同一列或同一斜线上(92种结果,判断15720次)
// 使用一维数组:arr[i]=val 表示第i+1个皇后要放在第i+1行的第val+1列,
public class bahuanghou {public static void main(String[] args) {Queue8 queue8 = new Queue8();queue8.check(0);System.out.println(queue8.count);System.out.println(queue8.panduancount);}
}
class Queue8{int max=8;int[] array=new int[max];int count=0;int panduancount=0;//check每一次递归时,都有八次循环,循环结束,回溯到上层public void check(int n){//放置第n个皇后if(n==max){//8个都放置完毕print();return;}//for (int i = 0; i < max; i++) {array[n]=i;if(panduan(n)){//判断位置是否冲突check(n+1);//摆放下一个}//冲突就进入下一次循环,相当于把列后移了一次}}public boolean panduan(int n){//n为第n个皇后panduancount++;for (int i = 0; i < n; i++) {//i,n不同 皇后不可能同行//不同列+不同斜线(y=x;y=-x)if(array[i]==array[n]||(Math.abs(array[i]-array[n])==Math.abs(i-n))) {return false ;}}return true;}public void print(){count++;System.out.println(Arrays.toString(array));System.out.println();}
}
JAVA 算法 回溯相关推荐
- java实现回溯算法,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- JAVA算法:走迷宫回溯算法设计(JAVA版本)
JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = { {0, 1, 0, 0, 0}, {0, ...
- Java实现回溯算法中的装载问题---(详细)
回溯算法中的装载问题-Java (超详细) 回溯算法之装载问题 回溯算法中的装载问题-Java (超详细) 前言 一.如何实现回溯法? 二.具体事例: 装载问题的解决 1. 问题描述: 2.如何解决装 ...
- 回溯java算法_聊聊算法——回溯算法
"递归只应天上有,迭代还须在人间",从这句话我们可以看出递归的精妙,确实厉害,递归是将问题规模逐渐减小, 然后再反推回去,但本质上是从最小的规模开始,直到目标值,思想就是数学归纳法 ...
- java 符号三角形_算法java实现--回溯法--符号三角形问题
符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...
- JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)
JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合.. 当 n = 4 ...
- 【Java算法之dfs 与bfs详解】
下次再也不鸽了(つಥ㉨ಥ)つ 我发誓,真的!!! Java算法之dfs 与bfs 1. dfs 1.1 dfs递归 2. bfs 1. bfs常见两类问题 1.1==是否==有路径问题 1.2最短路径 ...
- java算法----排序----(6)希尔排序(最小增量排序)
1 package log; 2 3 public class Test4 { 4 5 /** 6 * java算法---希尔排序(最小增量排序) 7 * 8 * @param args 9 */ 1 ...
- 希尔排序的java算法_Java算法系列篇 【希尔排序】
什么? 搞Java不会算法? 由于个人兴趣原因以及工作所需,最近了解Java算法的相关案例 及时分享 感兴趣的欢迎交流 希尔排序 描述: 基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直 ...
- 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...
最新文章
- linux apr文件解压失败,Linux安装apache服务器遇到的问题
- 乡村振兴谋定齐鲁样板-农业大健康·周荣江:国情讲坛创新
- Xcode9 新功能
- 快手新作品监控提醒助手,可无水印下载视频和封面
- Mcafee VirusScan系列
- Multi-Similarity Loss with General Pair Weighting for Deep Metric Learning 阅读笔记
- 如何统计钣金文档中向上和向下折弯的个数
- 微信小程序:map地图自动缩放自适应大小
- 面试官:SPA(单页应用)首屏加载速度慢怎么解决?
- 【雷达与对抗】【2017.06】空中目标的无源雷达探测
- 设计师必备!超好用的MAC电脑网页设计师软件
- metaWRAP bin_refine 模块如何优化分箱结果
- 全军尽墨的Android应用:社会化授权登录及分享安全漏洞
- Deepdive 教程--数据准备
- 形参和实参的定义和区别
- 无服务器计算:云计算的下一阶段
- MacBook杀毒软件CleanMyMac X4.13
- 那些在2009年失意的互联网“伟人”
- TL138-EVM U-Boot启动方法及启动参数详解
- TFC 2017 腾讯Web前端大会 全场笔记