import java.util.Arrays;
import java.util.Stack;
public class Puzzle {
private PuzzleNode[]puzzleNodes;
private static final int INITSIZE=10;
private Stack<PuzzleNode>stack=new Stack<>();
public Puzzle() {
this.puzzleNodes = new PuzzleNode[INITSIZE];//每个格子中的元素null
}
//第一步:将节点信息存储到数组中(初始化一维数组)
private void initPullzle(){
int[]arr={4,8,5,2,3,5,1,6,4,0};//随机生成数组
for(int i=0;i<puzzleNodes.length;i++){
puzzleNodes[i]=new PuzzleNode(i,arr[i]);
}
}
//第二步:调整每个节点的左右方向是否可走
private void adjustDirection(){
for(int i=0;i<puzzleNodes.length;i++){
//左边是否可走
if(i-puzzleNodes[i].getValue()>=0){
puzzleNodes[i].setLift(true);
}
//右边是否可走
if(i+puzzleNodes[i].getValue()<puzzleNodes.length){
puzzleNodes[i].setRight(true);
}
}
}
public void goPuzzle(){
initPullzle();
adjustDirection();
stack.push(puzzleNodes[0]);
int size2=0;
while(!stack.isEmpty()){
//下一个栈操作
PuzzleNode top=stack.peek();//获取栈顶元素
int value=top.getValue();
int index=top.getIndex();
if(value == 0 && index == puzzleNodes.length-1){
System.out.println("成功找到路径");
break;
}
if(top.isRight()){//右边是否能走
stack.push(puzzleNodes[index+value]);
//TODO:将入栈的节点 封路操作
puzzleNodes[index].setRight(false);
//节点1 的右边方向 节点2进行入栈
// 将节点1 走过的路false 节点1 的右边false
}
else if(top.isLift()){//左边是否能走
stack.push(puzzleNodes[index-value]);
puzzleNodes[index].setLift(false);
}else{
stack.pop();
}
size2++;
}
if(stack.isEmpty()){
System.out.println("查找路径失败");
}
//TODO:如果走到VALUE 0 需要打印走过的路径
if(stack.peek().getValue()==0){
int size=0;int i = 0;
int[]brr=new int[INITSIZE];
while (!stack.empty()){
brr[i] = stack.peek().getValue();
stack.pop();
i++;
size++;
}
int[]crr=new int[size];
int size1=size;
for(int j=0;j<size1;j++){
crr[j]=brr[size-1];
size--;
}
System.out.println("路径查找成功"+Arrays.toString(crr));
}
}
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public boolean isLift() {
return isLift;
}
public void setLift(boolean lift) {
isLift = lift;
}
public boolean isRight() {
return isRight;
}
public void setRight(boolean right) {
isRight = right;
}
}
public class TestDemo {
public static void main(String[] args) {
Puzzle puzzle=new Puzzle();
puzzle.goPuzzle();
}
}
Puzzle项目实现
最新推荐文章于 2021-02-18 23:39:23 发布