Кратчайший путь для рыцаря (BFS) - PullRequest
0 голосов
/ 15 октября 2018

Пожалуйста, помогите мне понять, что я делаю не так с моим кодом.Я пытаюсь найти кратчайший путь, используя BFS для решения проблемы, но он либо дает мне -1, либо 2. Он должен дать мне 6 в качестве ответа.Что я делаю неправильно?Вот в чем проблема:

Учитывая шахматную доску, найдите кратчайшее расстояние (минимальное количество шагов), по которому рыцарь должен достичь данного пункта назначения из данного источника.

Например, N = 8(Доска 8 х 8), Источник = (7, 0) Пункт назначения = (0, 7)

Минимальное количество необходимых шагов: 6

Мой код указан ниже:

class Point {
    int x, y;
    public Point(int x, int y){
    this.x = x;
    this.y = y;
 }
}

class knightShortestPath {
    int N = 8;
    public static boolean visited[][];

public boolean isPositionValid(int x, int y){
    if( x < 0 || y < 0 || x > this.N || y > this.N){
        return false;
    }
    return true;
}

public void createChessBoard(int N) {
    this.N = N;
    visited = new boolean[this.N][this.N];
    for (int i = 0; i < this.N; i++) {
        for (int j = 0; j < this.N; j++) {
            visited[i][j] = false;
        }
    }
}

public int BFS(Point source, Point destination) {
    int row[] = {2, 2, -2, -2, 1, 1, -1, -1};
    int col[] = {1, -1, 1, -1, 2, -2, 2, -2};
    Queue<Point> queue = new LinkedList<>();
    queue.offer(source);
    visited[source.x][source.y] = true;
    int minimumNumSteps = 0;

    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            Point pt = queue.poll();
            if (pt.x == destination.x && pt.y == destination.y) {
                return minimumNumSteps;
            }
            for (int j = 0; j < size; j++) {
                Point next = new Point(pt.x + row[i], pt.y + col[j]);
                if (isPositionValid(pt.x + row[i], pt.y + col[j]) && !visited[i][j]) {
                    visited[i][j] = true;
                    queue.offer(next);
                }
            }
        }
        minimumNumSteps++;
    }
    return minimumNumSteps;
}


public static void main(String[] args) {
    knightShortestPath position = new knightShortestPath();
    position.createChessBoard(8);
    Point src = new Point(0,7);
    Point dest = new Point(7,0);
    System.out.println("The minimum number of steps are: " + position.BFS(src, dest)); //answer is 6
 }
}

1 Ответ

0 голосов
/ 15 октября 2018

Первое: я понятия не имею, как вы можете получить отрицательное значение.Вы никогда не уменьшаете minimumNumSteps после инициализации его 0. Возможно переполнение?Мне кажется странным ..

Кроме того, я вижу две проблемы:

  1. Два цикла for неверны.Вы в настоящее время перебираете queue.size().Вместо этого вы хотите выполнить итерацию по всем дочерним узлам текущего узла.
  2. Опрос текущей точки вне циклов for.

Итак:

while(!queue.isEmpty()) {
    Point pt = queue.poll();
    // check if it's target 
    // ...
    for (int i = 0; i < row.length; i++) {
        // ... 
        for (int j = 0; j < col.length; j++) {
            // ...
        }
    }
}

Еще одно примечание: когда очередь пуста и вы не достиглицель, нет решения.В настоящее время вы возвращаете некоторое значение, которое может быть неверно истолковано.

...