c - 我陷入了 if top == bottom 和 if bottom == top 的循环

标签 c recursion segmentation-fault

我正在编写一个使用二维数组的程序。用户选择一行和一列;如果至少有一个直接与 N S E 或 W 匹配的元素,则它变为 '.' 我一直遇到段错误,因为经过各种测试和解决问题后,我相当确定它陷入了 if top == bottom 和 bottom == top(或 left 和 right)的循环中。因为我需要检查所有四个方面,所以我需要同时检查上方和下方。 示例:

0 - + + -
1 + + - -
2 - + - -
3 + + + -
4 - - + -
  0 1 2 3

如果用户选择 (3,1),所有的 + 都将变为“.” 对于如何解决此问题的任何建议,我将不胜感激。此功能的代码如下。 谢谢!

extern int bb_pop(BBoardPtr b, int r, int c) {
    char bal;
    int curr, curc;
    curr = r;
    curc = c;           
    if(b->board[curr][curc] == b->board[curr-1][curc] && curr != 0 && b->board[curr-1][curc] != '.') {
        curr--;
        bb_pop(b, curr, curc);
        b->board[curr][curc] = '.';
        count++;
        curr = r;
        curc = c;
        }
    if(b->board[curr][curc] == b->board[curr][curc-1] && curc !=0 && b->board[curr][curc] != '.') {
        curc--;
        bb_pop(b, curr, curc);
        b->board[curr][curc] = '.';
        count++;
        curr = r;
        curc = c;
        }
    if(b->board[curr][curc] == b->board[curr+1][curc] && curr < rows-1 && b->board[curr+1][curc] != '.') {
        curr++;
        bb_pop(b, curr, curc);
        b->board[curr][curc] = '.';
        count++;
        curr = r;
        curc = c;
        }
    if(b->board[curr][curc] == b->board[curr][curc+1] && curc<cols-1 && b->board[curr][curc] != '.') {
        curc++;
        bb_pop(b, curr, curc);
        b->board[curr][curc] = '.';
        count++;
        curr = r;
        curc = c;
        }
    if(count > 0) {
    b->board[r][c] = '.';
    }   

    printf("count %i\n", count);    /////////////fix count
    return count;
}

最佳答案

在函数的顶部执行此操作:

charToFind = b->board[r][c];
b->board[r][c] = '.';
count = 1;

然后使用charToFind代替board[curr][curc],并移除所有board[curr][curc]='.' 因为你的递归函数会这样做。这应该是您的主体的样子:

if (r != 0 && b->board[r-1][c] == charToFind)
    count += bb_pop(b, r-1, c);
if (r < rows-1 && b->board[r+1][c] == charTofind)
    count += bb_pop(b, r+1, c);

// Do the same thing for the c-1 and c+1 cases.

需要注意的一件事是,如果您的棋盘很大,您可能会递归到非常深的深度并溢出您的堆栈。

关于c - 我陷入了 if top == bottom 和 if bottom == top 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954188/

相关文章:

c - 在 C 中使用 fget 读取固定数量的字符

javascript - 如何将事件传递给 Vue JS 嵌套组件中的直接父级

c++ - 字符串迭代器不在字符串末尾停止

c - 双向链表 - 段错误 - C

c - 一种方法会引发段错误,而另一种则不会。有什么不同?

c - 在 qemu 中打印内存地址范围

c - 结构指针总是被初始化为 nil

c - 打印文件的特定行

c - 如何分配递归中的内存分配

recursion - 使用 LISP 递归查找列表中的元素位置