Java 骑士';带邻接表的s-tour算法

Java 骑士';带邻接表的s-tour算法,java,depth-first-search,Java,Depth First Search,我试图用Java解决骑士之旅的问题。 我的目标是计算一匹马在棋盘上的所有可能行程。我尝试使用的是Adjandcy列表数据结构。现在的问题是,我知道哪些方块与某个方块相邻,但我不知道相邻方块的方向。我该如何解决这一问题?以下是您应该做的粗略概述: 创建一个带有向上、向下、向左和向右字段的“Square”类(加上访问器和修改器方法) 制作一个“棋盘”类来存储所有的方块并设置它们 制作一个“骑士”类在棋盘上移动(并检查移动是否有效) 最后,创建一个driver类来搜索和存储如何移动骑士 方形样品类别:

我试图用Java解决骑士之旅的问题。
我的目标是计算一匹马在棋盘上的所有可能行程。我尝试使用的是Adjandcy列表数据结构。现在的问题是,我知道哪些方块与某个方块相邻,但我不知道相邻方块的方向。我该如何解决这一问题?

以下是您应该做的粗略概述:

  • 创建一个带有向上、向下、向左和向右字段的“Square”类(加上访问器和修改器方法)
  • 制作一个“棋盘”类来存储所有的方块并设置它们
  • 制作一个“骑士”类在棋盘上移动(并检查移动是否有效)
  • 最后,创建一个driver类来搜索和存储如何移动骑士
  • 方形样品类别:

    public class Square
    {
        public final Square up;
        public final Square down;
        public final Square left;
        public final Square right;
        public Square(Square up, Square down, Square left, Square right)
        {
            this.up=up;
            this.down=down;
            this.left=left;
            this.right=right;
        }
        public Square getUp(){return up;}
        public Square getDown(){return down;}
        public Square getLeft(){return left;}
        public Square getRight(){return right;}
    }
    
    骑士等级示例:

    public class Knight
    {
        private Square mySquare;
    
        public Knight(Square start)
        {
            mySquare = start;
        }
    
        /*  7 0
         * 6    1
         * 
         * 5    2
         *  4 3   
         */
        public boolean move(int dir)
        {
            switch(dir)
            {
            case 0: try{
               mySquare=mySquare.getUp().getUp().getRight(); return true;
            } catch (NullPointerException e) {return false}
            case 1: try{
               mySquare=mySquare.getUp().getRight().getRight(); return true;
            } catch (NullPointerException e) {return false}
            case 2: try{
               mySquare=mySquare.getDown().getRight().getRight(); return true;
            } catch (NullPointerException e) {return false}
            case 3: try{
               mySquare=mySquare.getDown().getDown().getRight(); return true;
            } catch (NullPointerException e) {return false}
            case 7: try{
               mySquare=mySquare.getUp().getUp().getLeft(); return true;
            } catch (NullPointerException e) {return false}
            case 6: try{
               mySquare=mySquare.getUp().getLeft().getLeft(); return true;
            } catch (NullPointerException e) {return false}
            case 5: try{
               mySquare=mySquare.getDown().getLeft().getLeft(); return true;
            } catch (NullPointerException e) {return false}
            case 4: try{
               mySquare=mySquare.getDown().getDown().getLeft(); return true;
            } catch (NullPointerException e) {return false}
            default: return false;
            }
        }
    }
    

    你的邻接列表是存储“合法跳跃”还是存储“相邻方块”?。为什么你需要方向,只存储“方块ID”不是更简单吗?第一个方块是“0”,以此类推。你说的“合法跳跃”是什么意思?在你的棋盘上,“合法跳跃”是一个合法的骑士动作。当谈论邻接列表时,会想到网络。您正在尝试构建一个贯穿所有方块的网络,只有在合法的情况下才能在方块之间跳跃,通过连接方块来重新构建网络是有意义的。您能否详细说明“相邻方块的方向”是什么意思