回溯法求解独立钻石源码
独立钻石实体类:
package xuzhenzhen.com;
import java.util.ArrayList;
public class Diamond {
public static final int BLOCK=1;
public static final int NONE=0;
public static final int WALL=-1;
private int[][] array;
public Diamond() {
init();
}
public void init(){//初始化
array=new int[9][9];
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
array[i][j]=WALL;
}
}
for(int i=1;i<=7;i++)
for(int j=3;j<=5;j++){
array[i][j]=BLOCK;
array[j][i]=BLOCK;
}
array[4][4]=NONE;
}
public boolean isEnd(){//判断是否完成
for(int i=1;i<8;i++){
for(int j=1;j<8;j++){
if(array[i][j]==BLOCK){
if(i!=4||j!=4)return false;
}
}
}
return true;
}
public ArrayList
getMove(){//取得可以移动的块和方向
ArrayList
list=new ArrayList();
for(int i=1;i<8;i++){
for(int j=1;j<8;j++){
if(array[i][j]==BLOCK){
if(array[i-1][j]==BLOCK&&array[i-2][j]==NONE)
list.add(new MoveDirection(i, j,
MoveDirection.UP));
if(array[i+1][j]==BLOCK&&array[i+2][j]==NONE)
list.add(new MoveDirection(i, j,
MoveDirection.DOWN));
if(array[i][j-1]==BLOCK&&array[i][j-2]==NONE)
list.add(new MoveDirection(i, j,
MoveDirection.LEFT));
if(array[i][j+1]==BLOCK&&array[i][j+2]==NONE)
list.add(new MoveDirection(i, j,
MoveDirection.RIGHT));
}
}
}
return list;
}
public void move(MoveDirection
dir){//移动一次
int x=dir.getX();
int y=dir.getY();
array[x][y]=NONE;
switch (dir.getDir()) {
case MoveDirection.UP:
array[x-1][y]=NONE;
array[x-2][y]=BLOCK;
break;
case MoveDirection.DOWN:
array[x+1][y]=NONE;
array[x+2][y]=BLOCK;
break;
case MoveDirection.LEFT:
array[x][y-1]=NONE;
array[x][y-2]=BLOCK;
break;
case MoveDirection.RIGHT:
array[x][y+1]=NONE;
array[x][y+2]=BLOCK;
break;
}
}
public void reverseMove(MoveDirection
dir){//反向移动一次
int x=dir.getX();
int y=dir.getY();
array[x][y]=BLOCK;
switch (dir.getDir()) {
case MoveDirection.UP:
array[x-1][y]=BLOCK;
array[x-2][y]=NONE;
break;
case MoveDirection.DOWN:
array[x+1][y]=BLOCK;
array[x+2][y]=NONE;
break;
case MoveDirection.LEFT:
array[x][y-1]=BLOCK;
array[x][y-2]=NONE;
break;
case MoveDirection.RIGHT:
array[x][y+1]=BLOCK;
array[x][y+2]=NONE;
break;
}
}
}
移动方向类:
package xuzhenzhen.com;
public class MoveDirection {
public static final int UP=1;
public static final int DOWN=-1;
public static final int LEFT=2;
public static final int RIGHT=-2;
private int x;
private int y;
private int dir;
private boolean isVisited;
public MoveDirection(int x, int y, int dir) {
this.x = x;
this.y = y;
this.dir = dir;
this.isVisited=false;
}
public boolean isVisited() {
return isVisited;
}
public void setVisited(boolean isVisited) {
this.isVisited = isVisited;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getDir() {
return dir;
}
@Override
public String
toString() {
// TODO Auto-generated method stub
switch (dir) {
case UP:return "("+x+","+y+")"+":up";
case DOWN:return "("+x+","+y+")"+":down";
case LEFT:return "("+x+","+y+")"+":left";
case RIGHT:return "("+x+","+y+")"+":right";
}
return "("+x+","+")";
}
}
独立钻石算法类:
package xuzhenzhen.com;
import java.util.ArrayList;
import java.util.Stack;
public class DiamondAlgorithm {
private Diamond diamond;
private Stackstack;
public DiamondAlgorithm() {
this.diamond =new Diamond();
this.stack =new Stack();
}
public void operate(){
addStack(diamond.getMove());
while(!stack.isEmpty()){
MoveDirection dir=stack.peek();
if(!dir.isVisited()){//如果没有被访问则进行访问
diamond.move(dir);
dir.setVisited(true);
if(diamond.isEnd())return;
addStack(diamond.getMove());
}
else{//否则后退一步
dir=stack.pop();
diamond.reverseMove(dir);
}
}
}
public boolean addStack(ArrayList
list){
if(list.size()==0)return false;
for(MoveDirection dir:list){
stack.push(dir);
}
return true;
}
public void printResult(){
for(MoveDirection
dir:stack){
if(dir.isVisited())
System.out.println(dir);
}
}
}
测试主函数类:
package xuzhenzhen.com;
public class DiamondTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
DiamondAlgorithm alg=new DiamondAlgorithm();
alg.operate();
alg.printResult();
}
}
运行模拟图:
运行结果:(其中x坐标代表纵轴,y坐标代表横轴)
(6,4):up
(5,6):left
(7,5):up
(7,3):right
(5,4):right
(5,7):left
(5,3):down
(5,1):right
(4,5):down
(7,5):up
(4,7):left
(4,5):down
(4,3):right
(4,1):right
(4,3):down
(7,3):up
(3,5):down
(6,5):up
(3,7):left
(3,4):right
(2,3):down
(3,1):right
(1,5):down
(4,5):up
(1,3):right
(1,5):down
(3,6):left
(3,4):left
(5,3):up
(3,2):right
(2,4):down