为什么我的代码显示Segmentation Fault

Why is my code showing Segmentation Fault?

本文关键字:Segmentation Fault 显示 代码 我的 为什么      更新时间:2023-10-16

我的代码如下。它是给分割错误。我一直在调试它,但被卡住了!我找不出问题。有人能帮我吗?

#include <iostream>
#include <fstream>
using namespace std;
char art[200][200];
char art2[200][200];
int n;
void solve(char a, int x, int y);
int main() {
    // ifstream fin("cowart.in");
    // ofstream fout("cowart.out");
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> art[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            art2[i][j] = art[i][j];
    int rh = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (art[i][j] == 'R' || art[i][j] == 'G' || art[i][j] == 'B') {
                rh++;
                solve(art[i][j], i, j);
            }
        }
    }
    int rc = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            art[i][j] = art2[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (art[i][j] == 'G')
                art[i][j] = 'R';
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (art[i][j] == 'R' || art[i][j] == 'B') {
                rc++;
                solve(art[i][j], i, j);
            }
        }
    }
    cout << rh << " " << rc << endl;
    // system("PAUSE");
    // fin.close();
    // fout.close();
    return 0;
}
void solve(char a, int x, int y) {
    if (x < 0 || y < 0 || x >= n || y >= n)
        return;
    if (art[x][y] != a)
        return;
    art[x][y] == '.';
    if (x < n - 1)
        solve(a, x + 1, y);
    if (x > 0)
        solve(a, x - 1, y);
    if (y < n - 1)
        solve(a, x, y + 1);
    if (y > 0)
        solve(a, x, y - 1);
    return;
}

此代码是USACO问题414 的解决方案

测试用例i显示分段故障为:

5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

输出应为:4 3

solve()函数中,注意到这一行了吗?

art[x][y] == '.';

上面的代码测试art[x][y]是否等于'.',然后丢弃结果。它是合法的C++,但没有任何用处。智能编译器可能会向您发出警告。

这显然意味着任务:

art[x][y] = '.'; 

函数solve()进行无限递归,导致堆栈溢出。使用非递归而非迭代方法实现求解。用循环和迭代的迭代方式实现4-邻域问题

相关文章: