Рекурсивные положения рыцаря с заданным количеством ходов Строковый массив Java - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь напечатать доску с исходной позицией коней, она показывает все места на доске 8х8, которых она может достичь за указанное количество ходов. Пример ввода и вывода, который я имею в виду, будет чем-то как:

Number of Moves:1
Initial Row:3
Initial Column: 3

........
..x.x...
.x...x..
...x....
.x...x..
..x.x...
........
........

Я получаю эту ошибку:

at KnightMoves.move(KnightMoves.java:24)
at KnightMoves.move(KnightMoves.java:27)

Это мое решение:

import java.util.Scanner;
public class KnightMoves{
    public static void printBoard(String array [][]){
        for (int row=0; row<8; row++){
            for (int col=0; col<8; col++){
                    array [row][col]=".";
            }
        }
    }
    public static void initializeArray(String array [][]){
        for (int row=0; row<8; row++){
            for (int col=0; col<8; c++){
                array [row][col]=".";
            }
        }
    }
    public static void move (String array [][], int steps, int row, int col){
        if (steps==0){
            System.exit(0);
        }else{
            if (row<0 || row>=8 || col<0 || col>=8){
                return;
            }
            move(array,steps,row-2,col-1);
            move(array,steps,row-2,col+1);
            move(array,steps,row+2,col-1);
            move(array,steps,row+2,col+1);
            move(array,stepst,row-1,col-2);
            move(array,steps,row-1,col+2);
            move(array,steps,row+1,col-2);
            move(array,steps,row+1,col+2);
            steps=steps-1;
         }
     }
    public static void main (String args[]){
        Scanner s=new Scanner (System.in);
        String array [][]=new String [8][8];
        initializeArray(array);
        System.out.println("Number of moves:");
        int steps=s.nextInt();
        System.out.println("Starting row:");
        int row=s.nextInt();
        System.out.println("Starting column:");
        int col=s.nextInt();
        move(array,steps,row,col);
        printBoard(array);
    }
 }

Может кто-нибудь помочь мне исправить это? Я не знаю, что я делаю не так. Спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Хорошая первая попытка. Есть несколько проблем с вашим кодом:

В методе перемещения условие выхода для шагов должно просто возвращаться, как и для недопустимых строк / столбцов. Вы также должны хранить «X», куда Рыцарь движется. И наконец, сразу же уменьшите переменную steps при вызове рекурсии.

Эти изменения выглядят так:

public static void move(String array[][], int steps, int row, int col) {
    if (steps < 0 || row < 0 || row >= 8 || col < 0 || col >= 8)
        return;
    array[row][col] = "X";
    move(array, steps - 1, row - 2, col - 1);
    move(array, steps - 1, row - 2, col + 1);
    move(array, steps - 1, row + 2, col - 1);
    move(array, steps - 1, row + 2, col + 1);
    move(array, steps - 1, row - 1, col - 2);
    move(array, steps - 1, row - 1, col + 2);
    move(array, steps - 1, row + 1, col - 2);
    move(array, steps - 1, row + 1, col + 2);
}

И для правильной печати на плате используйте print вместо println при печати строки:

public static void printBoard(String array[][]) {
    for (int row = 0; row < 8; row++) {
        for (int col = 0; col < 8; col++) {
            System.out.print(array[row][col]);
        }
        System.out.println();
    }
}

После этого вы получите ожидаемый результат.

...