Я пишу рекурсивную функцию для начинающих, которая находит путь через заданный лабиринт 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. Почему он делает прыжок? Как это сделать? Как этого избежать?