Puzzle项目实现

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值