java 钻石依赖_独立钻石的解决方案-java算法

本文介绍了一种使用回溯法解决Java钻石依赖问题的方法。通过创建Diamond类来表示游戏状态,MoveDirection类表示移动方向,以及DiamondAlgorithm类实现回溯算法进行求解。在主函数中,通过运行算法并打印结果展示了解决过程。
摘要由CSDN通过智能技术生成

回溯法求解独立钻石源码

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

独立钻石实体类:

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();

}

}

运行模拟图:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

运行结果:(其中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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值