【问题标题】:Using recursion to find a 2D maze path. Seg Faulting. C使用递归查找 2D 迷宫路径。段故障。 C
【发布时间】:2013-12-19 03:53:03
【问题描述】:

我无法完成这个程序。任务是使用递归来找到穿过由 X 和 O 组成的迷宫的路径。可以通过的路径由 O's 指定。迷宫存储为文本文件。

这是一个示例迷宫:

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;
    }

【问题讨论】:

  • SO 不是代码审查网站。

标签: c recursion segmentation-fault maze


【解决方案1】:

find_path 没有明确的基本情况,因为开头的 if 已被注释掉。它做的第一件事就是用右边的单元格再次调用自己。 call 所做的第一件事就是再次调用自身,其右侧是单元格。没有什么可以阻止它直接从阵列的末端掉下来,在这一点上,你没有导致导弹在某个地方发射只是愚蠢的运气。

即使不是这样,也没有什么可以阻止它卡在右边有墙的牢房和左边的牢房之间。你试图向右走,但不能,所以你向左走。下一步,您可以再次向右走,这样就可以了。永远重复(或至少直到你吃光你的筹码)。

【讨论】:

  • 所以一旦我找到一个O,我应该把我以前的O变成一个X,这样我就不会回到那里了?
  • @lundstorm:我建议使用其他字符,这样您就可以区分不可访问的单元格和已访问的单元格。可能永远不需要,但是嗯。
【解决方案2】:

你有这个声明

char maze[8][8];

这样循环

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

也就是说,您从零循环到八个(包括),即 个索引。对于只有八个条目的数组。

这意味着您将超出数组的范围写入,从而导致未定义的行为。

要么改变你的循环条件,要么增加你的数组大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多