`
edr_
  • 浏览: 166986 次
  • 性别: 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

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

    算法详解之回溯法具体实现

    理论辅助: ...还是那个基调,不喜欢纯理论的东西,喜欢使用例子来讲诉理论,在算法系列总结:动态规划(解公司外包成本问题) 的那一节里面 我们举得是经典的0-1背包问题,在回溯算法里面也有一些很经典的问

    数据结构算法

    算法系列15天速成——第一天 七大经典排序【上】 算法洗脑系列(8)算法洗脑系列(8篇)——第八篇 概率思想 算法洗脑系列(8篇)——第七篇 动态规划 算法洗脑系列(8篇)——第六篇 回溯思想 算法洗脑系列(8篇)...

    Java数据结构和算法系列文章,源码.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    十大算法精讲资料.rar

    包含树、图、线性表、栈、队列、动态规划、回溯等多种算法的讲解。

    回溯法系列问题集合回溯法系列问题集合

    回溯法系列问题 原代码直接运行即可 经典算法总结

    恋上数据结构系列,数据结构与算法.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    计算机算法设计与分析

    本书是21世纪计算机学科系列教材之一。它以算法设计策略为知识单元系统地介绍计算机算法的设计方法和分析技巧。其主要内容包括:算法及算法复杂性基本概念,算法描述,有效算法最常用的设计策略--递归和分治法,动态...

    数据结构与算法之美.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    王晓东《算法设计与分析》课件

    21世纪大学本科计算机专业系列教材 【出 版 社】 清华大学出版社 【书 号】 9787302167198 【上架时间】 2008-3-18 ------------------ 目录概览第1章 算法引论 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法...

    基础的数据结构与算法以及一些算法题.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    学习数据结构和算法分析的一些实例,包括排序算法、搜索算法、递归、二叉树等等实例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    中国计算机学会 “21世纪大学本科计算机专业系列教材” 算法设计与分析

    主要内容介绍 第1章 算法引论 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法 第5章 回溯法 第6章 分支限界法

    韩顺平JAVA数据结构与算法,重点是算法!.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    基于java语言的数据结构及算法实现,LeetCode算法示例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    尚硅谷Java数据结构与java算法(Java数据结构与算法).zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    该库目的:学习算法,上传算法与数据结构的源代码.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构算法.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    【尚硅谷】数据结构与算法(Java数据结构与算法).zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    《数据结构与算法分析》书中数据结构与算法实现.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

Global site tag (gtag.js) - Google Analytics