Неожиданный шаг рекурсии в упражнении для начинающих C - PullRequest
1 голос
/ 20 июня 2020

Я пишу рекурсивную функцию для начинающих, которая находит путь через заданный лабиринт 12x12. У меня есть отдельная функция для вычисления начальной позиции (номера начального квадрата), но в этой задаче позиция задается, это квадрат 59. Функция mazeTraverse вычисляет x и y на основе положения указателя пути , превращает maze[y][x] в " x ", а затем вызывает себя, чтобы изменить положение в соответствии с тем, что вокруг него.

#include <stdio.h>

void mazeTraverse(char *[][12], int);

int main()
{
    char *labyrinth[12][12] = {{" # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # "},
                               {" # ", " . ", " . ", " . ", " # ", " . ", " . ", " . ", " . ", " . ", " . ", " # "},
                               {" . ", " . ", " # ", " . ", " # ", " . ", " # ", " # ", " # ", " # ", " . ", " # "},
                               {" # ", " # ", " # ", " . ", " # ", " . ", " . ", " . ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " # ", " # ", " # ", " . ", " # ", " . ", " . "},
                               {" # ", " # ", " # ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " # ", " . ", " # "},
                               {" # ", " # ", " # ", " # ", " # ", " # ", " . ", " # ", " # ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " . ", " . ", " # ", " . ", " . ", " . ", " # "},
                               {" # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # "}};
    int startingLocation = 59;
    
    mazeTraverse(labyrinth, startingLocation);

    return 0;
}

void mazeTraverse(char *maze[][12], int position)
{
    int y, x, exCounter, inCounter;
    
    y = position / 12;
    x = position % 12;
    
    maze[y][x] = " x ";
    
    for (exCounter = 0; exCounter <= 11; ++exCounter) {
        for (inCounter = 0; inCounter <= 11; ++inCounter)
            printf("%s", maze[exCounter][inCounter]);
        printf("\n");
    }
    printf("\n");
        
    printf("Position: %d\n", position);
    printf("x: %d, y: %d\n\n", x, y);
    
    if (maze[y - 1][x] == " # " && maze[y][x - 1] != " # ")
        mazeTraverse(maze, position - 1);
    if (maze[y - 1][x] == " . " && maze[y][x + 1] != " . ")
        mazeTraverse(maze, position - 12);                  // Up until this point everything goes as it should
    if (maze[y - 1][x] != " . " && maze[y + 1][x] != " # ") // This if statement is the root of the problem
        mazeTraverse(maze, position + 12);
    
}

Я еще не закончил sh писать эту функцию и не прошу для решения. Если вы выполните этот код, вы заметите, что после того, как поисковик сделает первый поворот налево и опустится вниз, пока не встретит " # ", он затем перейдет из квадрата 41 в квадрат 34, который находится внутри дальнего правого туннеля, и начнет спускаясь оттуда. Я попытался переформулировать третий оператор if внутри mazeTraverse, но он всегда перескакивает либо в квадрат 34, 46 или 70. Почему он делает прыжок? Как это сделать? Как этого избежать?

1 Ответ

0 голосов
/ 20 июня 2020

Может быть, это понадобится некоторым будущим поколениям C учеников. Вот блок из if операторов, которые заставили функцию работать правильно. Очевидно, ответ на мой вопрос заключался в том, чтобы ставить return перед каждым рекурсивным вызовом.

if (maze[y - 1][x] != " . " && maze[y][x - 1] == " . ")
    return mazeTraverse(maze, position - 1);
if (maze[y - 1][x] != " . " && maze[y + 1][x] != " # ")
    return mazeTraverse(maze, position + 12);
if (maze[y + 1][x] == " # " && maze[y][x - 1] != " . " && maze[y][x + 1] != " # ")
    return mazeTraverse(maze, position + 1);
if (maze[y - 1][x] == " . ")
    return mazeTraverse(maze, position - 12);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...