我正在编写一个使用二维数组的程序。用户选择一行和一列;如果至少有一个直接与 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/