Использование рекурсии для поиска пути в двумерном лабиринте. Ошибка сегмента. С

У меня возникли проблемы с завершением этой программы. Задача состоит в том, чтобы с помощью рекурсии найти путь через лабиринт, состоящий из крестиков и ноликов. Путь, по которому можно пройти, обозначен буквой O. Лабиринт хранится в виде текстового файла.

Вот пример лабиринта:

XOXXXXXX
XOXXXXXX
XOOOOXXX
XXXXOXXX
XXXXOOXX
XXXXXOXX    
XXXXXOOO
XXXXXXXO

И вот мой прикрепленный код. Я прилагаю весь свой код, но я не хотел бы, чтобы мне говорили, как именно это сделать, я здесь, чтобы учиться :-). Я действительно считаю, что моя проблема заключается в том, чтобы не учитывать тот же O, который я только что искал, но я не уверен на 100%. Спасибо!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int find_path(char maze[8][8], int coorx, int coory);

    int main(int argc, char *argv[])
    {
      char maze[8][8];
      int i=0,j=0;

      FILE *fp;
      fp = fopen(argv[1], "r");
      for(i=0;i<9;i++)
        for(j=0;j<9;j++)
          fscanf(fp,"%c",&maze[i][j]);
      fclose(fp);
      printf("%c", maze[2][3]);
      return 0;
    }

    int find_path(char maze[8][8], int coorx, int coory)
    {
      //if((maze[coorx][coory]!= 'O') && (coorx >=0) && (coorx < 8) && (coory >=0) &&
          //(coorx < 8)){
        if(find_path(maze, coorx + 1, coory) == 'O'){
          printf("(%d,%d)",coorx, coory);
        }
        else if(find_path(maze, coorx - 1, coory) == 'O'){
          printf("(%d,%d)",coorx, coory);
        } 
        else if(find_path(maze, coorx, coory + 1) == 'O'){
          printf("(%d,%d)",coorx, coory);
        }
        else if(find_path(maze, coorx, coory - 1) == 'O'){
          printf("(%d,%d)",coorx, coory);
        }

      return 0;
    }

person lundstorm    schedule 03.12.2013    source источник
comment
SO не является сайтом для проверки кода.   -  person Jens Gustedt    schedule 03.12.2013


Ответы (2)


find_path не имеет четкого базового регистра, так как if в начале закомментировано. Самое первое, что он делает, это снова вызывает себя с ячейкой справа. И первое, что делает вызов, это снова вызывает сам себя, с ячейкой справа от этого. Нет ничего, что помешало бы ему просто упасть с конца массива, и в этот момент это просто глупая удача, что вы не запустили ракеты куда-нибудь.

Даже если бы это было не так, ничто не мешает ему застрять между клеткой со стеной справа и клеткой слева от нее. Вы пытаетесь пойти направо, но не можете, поэтому идите налево. Следующий шаг, вы можете снова пойти направо, что вы и делаете. Повторяйте всю вечность (или, по крайней мере, пока не съедите свой стек).

person cHao    schedule 03.12.2013
comment
Итак, как только я найду О, я должен превратить свой предыдущий О в Х, чтобы я не возвращался туда? - person lundstorm; 03.12.2013
comment
@lundstorm: я бы предложил другого персонажа, чтобы вы могли различать невидимые ячейки и посещаемые. Может, и не понадобится, но да. - person cHao; 03.12.2013

У вас есть эта декларация

char maze[8][8];

И петля так

for(i=0;i<9;i++)

То есть вы выполняете цикл от нуля до восьми (включительно), что составляет девять индексов. Для массива всего восемь записей.

Это означает, что вы будете писать за пределами массивов, что приведет к неопределенному поведению.

Либо измените условие цикла, либо увеличьте размеры массива.

person Some programmer dude    schedule 03.12.2013