回溯法

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

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


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;
}
}

[size=medium]每次处于的位置,用Position 类表示:[/size]


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接口的内部类,用来存储该位置可以扩展的下面一系列的位置
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值