有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java回溯递归(骑士)

这就像N皇后问题。 给定的电路板尺寸(行、列) 和骑士人数(骑士)

在给定的棋盘上我可以容纳多少骑士

我将使用嵌套的int数组

1代表骑士占领了那个地方

99将代表自现有骑士攻击以来,没有骑士可以进入的地方

0代表骑士可以进入的空位

在运行调试之后,我发现knights(3,3,5)

[1,-1,-1][99,-1,-99]在这里,我被卡住了,我必须后退。[-99,-99,-99]

但在回溯中,查看棋盘[0][0]骑士的位置将如何攻击-->;委员会[2][1]

并且,棋盘[0][2]骑士将攻击-->;委员会[2][1]

因此,当我回溯并撤销棋盘[0][2]上的骑士时

它也撤销了-99,这是不应该的,因为有一个以上的骑士同时攻击该空间

如果您能给我一些建议,我将不胜感激

public class knightsPlacement {

    public static void knights(int row, int col, int knights) {
        if(row < 0 || col < 0 || knights < 0) {
            System.out.println("Enter new parameters");
            return;
        }

        int [][] board = new int[row][col];

        for(int i = 0; i < board.length; i++) {
            for(int y = 0; y < board[0].length; y++) {
                board[i][y] = 0;
            }
        }


                solveKnights(board, 0, 0, knights);


    }

    public static boolean solveKnights(int[][] board, int row, int col, int knights) {


        if(row < 0 || row >= board.length || col < 0 || col >= board[0].length) {
            return false;
        }
        if(board[row][col] == -1 || board[row][col] == -99) {
            return false;
        }


        board[row][col] = -1;
        knights = knights -1;


        if(knights == 0) {
            return true;
        }
        if((row-2) >= 0 && (col-1) >=0 ) {
            board[row-2][col-1] = -99;
        }
        if((row-1) >= 0 && (col-2) >= 0) {
            board[row-1][col-2] = -99;
        }
        if((row-2) >= 0 && (col+1) < board[0].length) {
            board[row-2][col+1] = -99;
        }
        if((row-1) >= 0 && (col +2) < board[0].length) {
            board[row-1][col+2] = -99;
        }
        if((row+2) < board.length && (col-1) >=0 ) {
            board[row+2][col-1] = -99;
        }
        if((row+1) < board.length && (col-2) >= 0) {
            board[row+1][col-2] = -99;
        }
        if((row+2) < board.length && (col+1) < board[0].length) {
            board[row+2][col+1] = -99;
        }
        if((row+1) < board.length && (col+2) < board[0].length) {
            board[row+1][col+2] = -99;
        }
        for(int i = 0; i < board.length; i++) {
            System.out.println(Arrays.toString(board[i]));
        }
        System.out.println();


    for(int rowCount = 0; rowCount < board.length; rowCount++) {
        for(int colCount = 0; colCount < board[0].length; colCount++) {
                            if(solveKnights(board, rowCount,colCount, knights))return true; 
                        }
                    }



            board[row][col] = 0;
            knights = knights +1;

            if((row-2) >= 0 && (col-1) >=0 ) {
                board[row-2][col-1] = 0;
            }
            if((row-1) >= 0 && (col-2) >= 0) {
                board[row-1][col-2] = 0;
            }
            if((row-2) >= 0 && (col+1) < board[0].length) {
                board[row-2][col+1] = 0;
            }
            if((row-1) >= 0 && (col +2) < board[0].length) {
                board[row-1][col+2] = 0;
            }
            if((row+2) < board.length && (col-1) >=0 ) {
                board[row+2][col-1] = 0;
            }
            if((row+1) < board.length && (col-2) >= 0) {
                board[row+1][col-2] = 0;
            }
            if((row+2) < board.length && (col+1) < board[0].length) {
                board[row+2][col+1] = 0;
            }
            if((row+1) < board.length && (col+2) < board[0].length) {
                board[row+1][col+2] = 0;
            }

            return false;

    }

}

共 (0) 个答案