当前位置: 首页 > 知识库问答 >
问题:

骑士巡演的问题

荆梓
2023-03-14

我制作了这段代码来完成骑士之旅,你必须和一个没有重复的骑士一起到达棋盘上的每一个方块,但我有一些问题。它只会打印一个没有移动的空棋盘,我不知道如何修复它。


import javax.lang.model.util.ElementScanner6;
public class KnightsTour
{
    private int[][] ChessBoard = new int[9][9];
    private boolean[] Taken = new boolean[9];
    private int[] Horizontal = {0,1,2,2,1,-1,-2,-2,-1};
    private int[] Vertical = {0,-2,-1,1,2,2,1,-1,-2};
    private int myRow, myCol;
    private int moveCount;

    public KnightsTour()
    {
        doKnightsTour();
    }
    public void doKnightsTour()
    {
        while(moveKnight()==true)
        {

        }
        printChessBoard();
    }

    private boolean moveKnight()
    {
        int randomPos;
        boolean moveMade = false;

        if(moveCount < 64)
        {
            
            if(allTakenNearby() == false)
            {
              
                while(moveMade = false)
                {
                   
                    randomPos = (int)(Math.random()*8) + 1;

                    if(Taken[randomPos] == false)
                    {
                      
                        myRow += Vertical[randomPos];
                        myCol += Horizontal[randomPos];
                        moveCount++;
                        moveMade = true;
                        
                    }
                }
            }

        }
        
        return moveMade;
    }

    private boolean allTakenNearby()
    {
        int tempRow;
        int tempCol;
        boolean allFilled = true;
        boolean notTaken;
        
        for(int i = 1; i<= 8; i++)
        {
            Taken[i] = false;
        }
        for(int i = 1; i <= 8; i++)
        {
            tempRow = myRow + Vertical[i];
            tempCol = myCol + Horizontal[i];

            if(tempRow >= 1 && tempRow <= 8 && tempCol >= 1 && tempCol <=8 )
            {
                if(ChessBoard[tempRow][tempCol] > 0 )
                {
                   Taken[i] = true;
                }
                else
                {
                    allFilled = false;
                }
            }
            else
            {
                Taken[i] = true;
            }
        }
        return allFilled;
    }

    private void printChessBoard()
    {
        int x;
        int y;

        System.out.println();
        System.out.println("ChessBoard is: ");
        System.out.println();

        for(x = 1; x <= 8; x++)
        {
            for(y = 1; y <= 8; y++)
            {
                if(y == 8)
                {
                    if(ChessBoard[x][y] == 0)
                    {
                        System.out.print("xx");
                        System.out.print("  ");
                    }
                    else if(ChessBoard[x][y] > 0 && ChessBoard[x][y] <= 9)
                    {
                        System.out.print("0" + ChessBoard[x][y]);
                        System.out.print("  ");
                    }
                    else
                    {
                        System.out.print(ChessBoard[x][y]);
                        System.out.print("  ");
                    }
                }
                else
                {
                    if(ChessBoard[x][y] == 0)
                    {
                        System.out.print("xx");
                        System.out.print("  ");
                    }
                    else if(ChessBoard[x][y] > 0 && ChessBoard[x][y] <= 9)
                    {
                        System.out.print("0" + ChessBoard[x][y]);
                        System.out.print("  ");
                    }
                    else
                    {
                        System.out.print(ChessBoard[x][y]);
                        System.out.print("  ");
                    }
                }
            }

            System.out.println();

        }
        System.out.println();
        System.out.println("Amount of Moves Made = " + moveCount);
    }
}

测试人员:


import javax.lang.model.util.ElementScanner6;
public class KnightsTourTester
{
    public static void main(String args[])
    {
        KnightsTour tour = new KnightsTour();
        
    }
}

如果您有任何建议,我将不胜感激,我正在为一门课做这件事,所以我需要尽快完成。

共有2个答案

端木震博
2023-03-14

在我看来,如果你的moveKnight()方法移动了骑士,但从来没有更新棋盘。所以在64步之后,它似乎仍然没有被触及。

艾修然
2023-03-14

while(movemake=false)-赋值而不是比较(请不要在布尔值上使用比较-while(!movemake)

 类似资料:
  • 我正在尝试编写一个骑士之旅算法,它有两个数组,访问和板。ACCESS是我用来判断下一步是什么的数组,board是用户将看到的最终结果的数组。我的算法通过检查找到可用移动次数最少的正方形,然后到达那里。如果恰好有两个可能的移动,并且可用的移动次数相同,我会找到哪一个离中心最远(离边界最近),然后移动到该点。这个算法应该会一直提供一个完美的64步骑士巡演程序,但我通常只得到大约60步,有人能告诉我为什

  • 我试着用回溯法为骑士之旅问题编写代码。我的代码适用于4x4矩阵,但对于8x8矩阵,它不会在输出屏幕上显示任何内容。 我不知道我做错了什么。 我的代码就是这样工作的: 如果所有的广场都参观过 其他的 > 向solution vector添加下一步动作之一,并递归检查该动作是否会导致解决方案。(一个骑士最多可以走八步。我们在这一步的八步中选择一步)。 如果在上述步骤中选择的移动没有导致解决方案,则从解

  • 我正在尝试编写骑士之旅递归算法: 谁能告诉我哪里出错了?我已经一步一步地检查了什么池算法正在添加到列表中。什么是大惊奇算法在添加4,3池和6,4池后,应该用6,4作为实际位置来称呼它自己,但我不知道为什么它用4,3作为实际位置来称呼自己。

  • 另一个经典问题,我们可以用来说明第二个通用图算法称为 “骑士之旅”。骑士之旅图是在一个棋盘上用一个棋子当骑士玩。图的目的是找到一系列的动作,让骑士访问板上的每格一次。一个这样的序列被称为“旅游”。骑士的旅游难题已经吸引了象棋玩家,数学家和计算机科学家多年。一个 $$8 \times 8$$ 棋盘的可能的游览次数的上限为 $$1.305 \times 10^{35}$$ ;然而,还有更多可能的死胡同

  • 当我运行程序而不是找到骑士之旅时,我收到了一个StackOverflow错误。任何想法是什么导致了这一点,以及我如何改变我的代码,实际上找到骑士之旅,并摆脱这个错误。项目是为我的CS280课程,并在周五到期,请帮助。谢谢!!

  • 《FG 骑士进度条》是《异星工厂网页版》作者基于《骑士进度条 2》复刻的另一款放置游戏,相对来说,界面看起来像是一款游戏了。玩法上变化不大,增加了成就功能。 可以导入《骑士进度条2》的存档,接档直接玩。