`

回溯法

阅读更多
  大三上学习算法时都没怎么真正去体会算法的精髓,更没想过如何将它用到应用程序中?
想到找工作时算法数据结构作为基础,会经常被考到,于是最近有开始复习算法了。

        回溯递归,可以解决很多问题,比如迷宫问题,n皇后问题等
于是我通过看书学习,先实现了一个通用的回溯算法,与具体应用程序无关,回溯法核心是进行递归地找到目标位置,每次处于的位置,先判断是它是否符合要求,若符合,继续递归到下个位置,否则,回到上一个可选择的位置,BackTrack.java如下:



package 数据结构及算法.回溯法;

import java.util.Iterator;

public class BackTrack {
    Application app;
    
    public BackTrack(Application app){
    	this.app=app;
    }
    @SuppressWarnings("rawtypes")
	public boolean tryToSolve(Position pos){
    	boolean success=false;
    	Iterator itr=app.iterator(pos);

    	while(!success&&itr.hasNext()){
    		pos=(Position) itr.next();
    		if(app.valid(pos)){
    			app.record(pos);
    			//System.out.println(pos.getRow()+" "+pos.getColumn());
    			if(app.done(pos)){
        			success=true;
        			//System.out.println(app+"\n");
        		}
        		else{
        			success=tryToSolve(pos);
        			if(!success){
        				app.undo(pos);
        			}
        		}
    		}
    		
    	}
    	return success;
    }
}

每次处于的位置,用Position 类表示:

package 数据结构及算法.回溯法;

public class Position {
    private int column;
    private int row;
    public Position(){
    	this.row=0;
    	this.column=0;
    }
    public Position(int row,int column){
    	this.row=row;
    	this.column=column;
    }
    
    public int getRow(){
    	return this.row;
    }
    public int getColumn(){
    	return this.column;
    }
}


为实现具体应用程序给出接口 Application.java

package 数据结构及算法.回溯法;

import java.util.Iterator;


public interface Application {
    boolean valid(Position pos);//判断是否有效,符合要求
    void record(Position pos);//符合要求,就记录下来
    boolean done(Position pos);//表示找到目标
    void undo(Position pos);//从该位置下去无法找到目标,必须撤销,但可以留下撤销的痕迹,表示曾经走过
    String toString();//重写,方便输出
    Iterator iterator(Position pos);//可通过写个实现Iterator接口的内部类,用来存储该位置可以扩展的下面一系列的位置
}


分享到:
评论

相关推荐

    常见回溯法问题解决方案

    回溯法是一种在尝试解决问题时,通过试探性地做出选择并逐步构造可能的解,当发现当前选择不能导致有效解时,就撤销该选择并尝试其他路径的搜索算法。它通常用于解决组合优化问题,如圆排列问题、装载问题等。在本...

    回溯法(ACM程序设计,算法竞赛)

    回溯法是一种重要的算法策略,尤其在解决计算机科学中的优化问题和搜索问题时十分常见,如ACM程序设计和算法竞赛中就常常被用到。它通常用于在约束条件下寻找问题的所有解或某个最优解。回溯法的核心思想是通过试探...

    批处理作业调度回溯法java实现

    批处理作业调度回溯法java实现 批处理作业调度回溯法是一种解决作业调度问题的算法,它通过回溯法来搜索所有可能的解决方案,以找到最佳的作业调度方式。在这个Java实现的批处理作业调度程序中,我们使用回溯法来...

    回溯法实验报告

    【回溯法实验报告】 本实验报告主要围绕回溯法这一算法进行,旨在深入理解和掌握回溯法的基本思想和应用。回溯法是一种基于试探性的解决问题的算法,它通过逐步构造可能的解并检查这些解的合法性来寻找问题的正确...

    哈密顿回路 回溯法——C++代码

    在这个“哈密顿回路 回溯法——C++代码”的项目中,我们看到的是使用C++编程语言来实现的回溯法求解哈密顿回路。C语言和C++虽然在语法上有一定差异,但C++是在C语言基础上发展起来的,因此,此处的描述中提到的...

    n后问题---递归回溯法 n后问题---递归回溯法

    n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...

    回溯法01背包

    回溯法是一种在解决问题时通过试探性地做出选择并逐步构造解决方案的方法,如果发现当前选择无法得到有效的解,则撤销该选择,尝试其他可能的选择,这一过程就像沿着一条路径探索直至找到答案或者证明无解,然后返回...

    批处理作业调度问题 回溯法——C++代码

    在这个场景中,回溯法是一种常用的解决策略,它是一种试探性的解决问题的方法,通过尝试所有可能的解决方案并逐步构建答案,当发现当前路径无法导出有效解时,会撤销最近的选择,退回一步重新尝试其他路径。...

    回溯法实验报告解装载问题

    回溯法是一种基于试探性的深度优先搜索的算法,常用于解决约束满足问题。在这个实验报告中,回溯法被应用于解决装载问题,具体是经典的N皇后问题,即在N×N的棋盘上放置N个皇后,使得每行、每列以及对角线上的皇后...

    Python基于回溯法解决01背包问题实例

    这个问题可以通过多种方法解决,其中回溯法是一种常用的算法策略。 回溯法是一种通过深度优先搜索解决问题的算法,它尝试构建解决方案的候选树,并在发现无法找到有效解时撤销最近的选择,返回上一层继续探索其他...

    回溯法求解子集和问题

    回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...

    0-1背包的回溯法求解

    在0-1背包问题中,回溯法通过构建所有可能的物品选取组合,并在过程中不断剪枝,避免无效的搜索,来寻找最优解。 以下是0-1背包问题回溯法求解的详细步骤: 1. **定义状态**:通常用一个二维数组`dp[i][w]`表示前i...

    实验四 用回溯法求解跳马问题.zip

    标题中的“实验四 用回溯法求解跳马问题”是一个典型的计算机科学与编程相关的课题,主要涉及的问题是利用回溯法解决棋盘游戏中的马的移动路径问题。回溯法是一种通过试探性的解决问题的方法,当遇到不符合条件的...

    回溯法解数独问题

    ### 回溯法解数独问题 #### 一、数独简介 数独是一种起源于18世纪瑞士的数字逻辑游戏,它不仅是一项娱乐活动,也是一种极佳的智力锻炼工具。标准的数独由9个3×3的小方格组成的大九宫格构成,共计81个格子。游戏...

    圆排列问题-回溯法-排列集

    圆排列问题-回溯法-排列集 圆排列问题是一种经典的NP难问题,它是指在一个圆形的排列中,找到一个最佳的排列,使得圆形的总长度最小。这是一个非常复杂的问题,需要使用高级的算法来解决。在这个问题中,我们使用的...

    回溯法解决数独问题-2.docx

    回溯法是一种通过递归试错来寻找问题所有解决方案的算法,它的基本思想是:在尝试解决一个问题时,如果发现已不满足求解条件,就回退到上一步或上几步重新尝试其他可能的解,直到找到所有正确解或确定无解为止。...

    用回溯法解决01背包问题C语言实现

    回溯法是一种试探性的解决问题的方法,通过尝试所有可能的解决方案,并在不合适时撤销上一步操作,从而避免无效的搜索。在01背包问题中,回溯法可以用来枚举所有可能的物品选取状态,找到最优解。 以下是使用C语言...

Global site tag (gtag.js) - Google Analytics