`
edr_
  • 浏览: 169809 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

算法系列之回溯算法

阅读更多
回溯算法
也称试探法,一种系统地搜索问题的解的算法。其基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试(类似穷举法)。
还记得中学时代的排列组合吗?太像了。

废话就不多说了看题估计就明白了,大概叙述一下昨天一家游戏公司的机试题:
骑士巡游:在一个8X8的格子中,骑士从任意一个格子出发,只能左、右、上、下走,走遍全部格子(不能重复走走过的格子),一共有多少种走法?

个人思路:
  • 首先、定义一个二维boolean数组变量boolean[][] pan,走法总数solution_nums;对应值作为判断是否骑士走过该格子,一开始设定为false(全部没走过),然后每走过一个格子便设定其值为true。当走完一次完整的64个格子之后将走法总数+1;
  • 其次,定义方法goNext(),即骑士即将走的格子,当然需要判断骑士是否越位,格子是否走过了以及判断是否已经走完所有格子了;
  • 最后,当然是入口了,定义入口方法first(),假设开始点是(0,0),则first入口里就需要调用goNext(),根据根据参数判断有向上、向下、向左、向右。

实现代码:
package test.aglorith;

public class Recall {
	static int solution_nums=0;
	static boolean[][] pan=new boolean[8][8];
	
	//设置入口函数
	static void first(int i,int j){
		pan[i][j]=true;
		//up
		goNext(i-1, j, 1);
		//down
		goNext(i+1, j, 1);
		//left
		goNext(i, j-1, 1);
		//right
		goNext(i, j+1, 1);
	}
	
	static void goNext(int i,int j,int nums){
		//判断是否越界,是否走过
		if ((i>=0&i<8) && (j>=0&j<8) && pan[i][j]==false) {
			pan[i][j]=true;
			nums++;
			//判断是否走遍了所有格子
			if (nums==64) {
				solution_nums++;
				System.err.println(solution_nums+"~~");
				pan[i][j]=false;
				return;
			}
			
			//up
			goNext(i-1, j, nums);
			//down
			goNext(i+1, j, nums);
			//left
			goNext(i, j-1, nums);
			//right
			goNext(i, j+1, nums);
			
			//做好扫尾工作,擦除走过的轨迹
			pan[i][j]=false;
		}
	}
	
	public static void main(String[] args) {
		first(0, 0);//假设从(0,0)点开始
		System.err.println(solution_nums);
	}
}

时间有点长,以至于一直怀疑自己的算法有问题,可能陷入死循环。如果嫌时间太长,可以将二维数组,判断变量稍微改一下,7X7就需要挺久时间了。
经典的回溯算法中还有三着色,八皇后问题,迷宫问题。

据说这家公司的技术总监14岁就可以做出这道题了。见仁见智。

Have a nice day~
0
0
分享到:
评论
2 楼 edr_ 2013-11-01  
ping2010 写道
你这个算法直接死循环了,

额,尝试把格子设为4X4或者5X5,也可以设置更小的,当然判断条件稍微改一下就好了。昨天试了7X7的走法是1570446次。8X8的就没试了~
1 楼 ping2010 2013-11-01  
你这个算法直接死循环了,

相关推荐

    算法分析论文——回溯算法的应用.zip

    4. **决策序列**:回溯算法通常涉及一系列的决策,每个决策可能影响解空间的进一步扩展。 5. **后向传播**:在回溯过程中,对已经做出的决策进行撤销,以尝试不同的决策路径。 回溯算法的应用广泛,包括但不限于: ...

    回溯算法全代码

    3. **适用问题类型**:回溯算法适用于那些可以分解为一系列决策的问题,且每个决策都有有限个可能的选择,例如图的着色问题、旅行商问题、八皇后问题等。 二、具体应用实例 1. **01背包问题**:给定一组物品,每件...

    回溯算法的C++实现

    在C++中实现回溯算法解决此问题,主要是寻找从左上角到右下角的一条路径,使得路径上的数字之和最大。回溯过程中,我们会尝试沿着两个方向(右下方或右方)移动,并记录当前路径的总和,当到达三角形底部时,比较...

    经典问题的回溯算法

    ### 经典问题的回溯算法 #### 一、引言 在现实生活中,很多问题并不像数学问题那样可以通过公式直接解决,它们往往需要经历一系列复杂的步骤和多种可能性的探索才能找到答案。这类问题通常涉及一定的规则,而这些...

    界回溯算法在排课系统模型中的应用.pdf

    它与穷举法不同之处在于,回溯算法能够在搜索过程中提前识别出不可行的解,从而避免不必要的计算。 - **界回溯算法**:通过在搜索过程中利用预定义的约束条件来提前剪枝,减少搜索空间,从而提高算法的效率。 - **...

    backtracking_N皇后_01背包_回溯算法_售货员问题_图的m着色_

    回溯算法是一种强大的搜索策略,常用于解决一系列的组合优化问题。它通过尝试所有可能的解决方案,当发现某个分支无法得到满足条件的解时,就回溯到上一个决策点,选择其他路径继续探索。本篇文章将深入探讨回溯算法...

    回溯算法求解数独

    回溯算法是一种基于试探和排除的搜索策略,广泛应用于解决一系列具有约束条件的问题,如棋盘游戏、逻辑谜题(如数独)等。在数独问题中,我们需要填充一个9x9的网格,其中每个小格子属于一个3x3的子网格,要求每一行...

    回溯算法的刷题笔记,回溯专训

    回溯算法是一种用于解决组合优化问题的搜索算法,它通过尝试所有可能的解决方案,并在遇到无效或不符合条件的解时进行“回退”,以找到有效的解。回溯算法的核心思想是通过递归地构建解决方案,并在每一步决策时检查...

    tsp问题之回溯法 cpp实现

    回溯法是一种搜索算法,用于在解空间树中寻找问题的解。它通过逐步构建可能的解决方案,并在遇到无效或无解的分支时回退到上一步,尝试其他路径,直到找到满足条件的解。这种方法适用于解决约束满足问题和组合优化...

    青蛙换位游戏算法实现C++ 回溯法

    青蛙换位游戏是一种经典的逻辑推理问题,通常出现在计算机科学中的算法设计与分析课程中,用于教授学生如何使用回溯法来解决复杂问题。在这个游戏中,有一排数字,我们需要通过一系列合法的操作将它们重新排列,使得...

    回溯算法.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    算法竞赛-回溯与解空间树例子

    总的来说,回溯法和解空间树在算法竞赛中扮演着重要角色,它们能帮助我们解决一系列复杂的问题,而C语言则是实现这些算法的有效工具。通过深入理解和熟练运用这些知识,可以在竞赛中取得优异的成绩。

    mooc ppt 算法设计与分析 屈婉玲.zip

    屈婉玲教授的MOOC课程深入浅出地讲解了这一主题,通过一系列PPT和讲座捕获(Capture)文件,帮助学习者掌握算法的核心概念和技巧。 在算法设计方面,课程可能涵盖了经典的算法设计范式,如分治法、动态规划、贪心...

    算法合集系列1(共2部分打包)算法合集系列1(共2部分打包)算法合集系列1(共2部分打包)

    《算法合集系列1》是针对计算机科学与信息技术领域中重要的算法学习资源的打包集合,主要目的是帮助学习者深入理解和掌握各种基础及高级算法。在这个压缩包中,可能包含了多种类型的算法实现,如排序算法、搜索算法...

    算法合集系列.rar

    《算法合集系列》是一个包含了丰富算法资源的压缩包文件,源自CSDN平台,可能包含Word文档和PDF格式的资料。这些文档通常涵盖了各种算法的详细解释、实例解析以及可能的实现代码,旨在帮助学习者深入理解并掌握算法...

    0-1背包问题(回溯算法)

    在0-1背包问题中,回溯算法通过试探性地选取物品并跟踪当前选择的效果,当发现当前路径无法达到最优解时,会撤销先前的选择,尝试其他可能的路径,这个撤销并尝试新路径的过程就是“回溯”。 算法设计通常包括以下...

Global site tag (gtag.js) - Google Analytics