Как отобразить только правильный маршрут для выхода из Maze на Java? - PullRequest
0 голосов
/ 28 ноября 2018

Итак, я создал решатель лабиринтов, который находит маршруты до конца, однако как мне сделать так, чтобы, если маршрут приводил в тупик, он затем переписывался в "" пустые места.Ниже приведен мой метод решения лабиринта.

Спасибо всем, Решение от @Leo Aso добилось цели.

   private boolean solveMaze(int coorda, int coordb) { 
    return solveMaze(coorda, coordb, 0, 0);
}

private boolean solveMaze(int coorda, int coordb, int dx, int dy) { 

    switch (myMaze[coorda][coordb]) {
        case '#': case 'X': return false;
        case 'E': return true;
    }

    myMaze[coorda][coordb] = 'X';

    if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
        dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
        dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
        dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
        return true;
    }       

    myMaze[coorda][coordb] = ' ';
    return false;
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Попробуйте и посмотрите, работает ли он.

private boolean solveMaze(int coorda, int coordb) { 
    return solveMaze(coorda, coordb, 0, 0);
}

private boolean solveMaze(int coorda, int coordb, int dx, int dy) { 

    switch (myMaze[coorda][coordb]) {
        case '#': case 'X': return false;
        case 'E': return true;
    }

    myMaze[coorda][coordb] = 'X';

    if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
        dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
        dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
        dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
        return true;
    }       

    myMaze[coorda][coordb] = ' ';
    return false;
}

Проблема, с которой вы столкнулись, заключается в том, что вы не гарантировали, что рекурсии не будет разрешено вернуться в том направлении, откуда она пришла.Если вы позволите это, то все пути ведут к выходу, так как разворот является допустимым ходом.Вот где приходят dx и dy. Когда вы идете на восток / запад, dx равен + 1 / -1, а когда вы идете на север / юг, dy равен -1 / + 1 соответственно.Большое утверждение if гарантирует, что вы не пойдете в каком-либо направлении, если вы просто шли с этого пути, например, не двигайтесь на восток, если вы только что двинулись на запад.

0 голосов
/ 28 ноября 2018

Вы могли бы написать заявление if, которое бы понимало, что такое тупик.Таким образом, он будет в основном искать, где три разных направления были «#».Тогда вы можете получить оператор if, который говорит, что deadend имеет значение true, проследить ваши шаги назад и удалить значения x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...