我正在编写经典骑士之旅的代码,我的代码似乎大部分都在做正确的事,但对于可能的开发板它仍然给我“不可能”,我不知道为什么。 (例如:对于从第1行,第3列开始的,具有3行,4列的表,它将失败)。当计算行和列时,我从索引0开始。我认为回溯不正确。谁能帮我指出我的错误?谢谢

import java.util.*;
public class KnightGame
{
    private int rows;
    private int cols;
    private int [][] array;

    public void initializeArray()
    {
        array = new int [rows][cols];
    }

    public boolean fill (int x, int y, int n)
    {
        if ( x < 0 || x >= rows || y<0 || y >= cols )  //outside of board
            return false;
        else if (array[x][y] != 0)   //location has been visited, array element occupied
            return false;
        else if ( n == (rows * cols))       //have visited all locations
            return true;
        else
        {
            array[x][y] = n;
            if ( fill(x+1, y-2, n+1) || fill(x-2, y+1, n+1) || fill(x+1, y+2, n+1)
               || fill(x+2, y+1, n+1) || fill(x-2, y-1, n+1) || fill(x-1, y-2, n+1) ||
               fill(x-1, y+2, n+1) || fill(x+2, y-1, n+1))
                return true;
            else
                return false;
        }
    }

    public static void main (String [] args)
    {
         KnightGame game = new KnightGame();
        int [] st = new int [2];
        int startx, starty;
        Scanner keyIn = new Scanner (System.in);

        System.out.println("Enter number of rows: ");
        game.rows=keyIn.nextInt();

        System.out.println("Enter number of columns: ");
         game.cols = keyIn.nextInt();

        game.initializeArray();

        System.out.println("Enter starting location: ");
         for (int i=0; i<2; i++)
         {
             st[i] = keyIn.nextInt();
         }

         startx = st[0];
         starty = st[1];

         //testing for correct starting values
         System.out.println("starting values: " + startx + " " + starty);

        if (game.fill(startx, starty, 1))
        {
            for (int i=0; i<game.rows; i++)
                {
                  for (int j=0; j<game.cols; j++)
                  {
                     System.out.print(game.array[i][j] + " ");
                  }
                }
        }

        else
            System.out.println("Board could not be completed!");

    }

}

最佳答案

回溯时,您并没有清除板上的方块。因此,如果您沿一条可能的路径递归,失败,然后再尝试另一条路径,则即使第一次尝试仍然会标记正方形,因此第二次尝试也会失败。

        array[x][y] = n;
        if ( fill(x+1, y-2, n+1) || fill(x-2, y+1, n+1) || fill(x+1, y+2, n+1)
           || fill(x+2, y+1, n+1) || fill(x-2, y-1, n+1) || fill(x-1, y-2, n+1) ||
           fill(x-1, y+2, n+1) || fill(x+2, y-1, n+1))
            return true;
        else
        {
            array[x][y] = 0; // <- add this line
            return false;
        }

08-24 18:43