KnightsTour 无限循环迭代

时间:2021-05-20 02:43:06

标签: java knights-tour

我正在尝试编写一个程序,根据棋盘上的输入点输出骑士巡回赛的动作。出于某种原因,每当我运行这个程序时,我都会遇到一个无限循环。我想了很多,也想不出一个合理的理由。有人可以向我解释一下问题是什么以及如何解决吗?

谢谢!

public ArrayList<String> tour (int x, int y) {

    int[][] board = new int[8][8];

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            board[i][j] = -1;
        }
    }

    int[] xMoves = {-2, -2, -1, -1, 1, 1, 2, 2};
    int[] yMoves = {1, -1, 2, -2, 2, -2, 1, -1};
    int lastIndex = 0;


    ArrayList<Integer> indices = new ArrayList<>();

    ArrayList<String> visited = new ArrayList<>();

    visited.add("" + x + y);



    while (visited.size() < 64) {

        int i;

        for (i = lastIndex; i < 8; i++) {

            int xCoor = xMoves[i] + x;
            int yCoor = yMoves[i] + y;

            if (xCoor >= 0 && xCoor <= 7 && yCoor >= 0 && yCoor <= 7
                    && board[xCoor][yCoor] == -1)
            {

                x = xCoor;
                y = yCoor;

                indices.add(i);
                visited.add("" + x + y);
                board[x][y] = 0;
                lastIndex = 0;
                break;



            }


        }

        if (i < 7) {
            continue;
        }


        /*
            If no possible moves left, backtrack
            */

        board[x][y] = -1;
        lastIndex = indices.remove(indices.size() - 1);
        visited.remove(visited.size() - 1);

        x -= xMoves[lastIndex];
        y -= yMoves[lastIndex];

        lastIndex++;



    }


    return visited;


}

0 个答案:

没有答案
相关问题