【问题标题】:How to remove SIGABRT error in my C++ code如何在我的 C++ 代码中删除 SIGABRT 错误
【发布时间】:2020-06-18 08:09:20
【问题描述】:

我的任务是查找给定图形(邻接矩阵)中是否存在从源到目的地的路径。源是 1,目标是 2,路径只能通过矩阵中的数字 3。我已经使用 BFS 解决了这个问题,但我收到了 SIGABRT 错误。如果有人可以帮助我,我仍然是编码的初学者。我在这里附上了代码。 问题如下 给定一个 N X N 矩阵 (M),其中填充了 1, 0, 2, 3。任务是在仅遍历空白单元格时找出是否存在从源到目的地的可能路径。您可以向上、向下、向右和向左移动。

单元格 1 的值表示源。 单元格 2 的值表示目的地。 单元格 3 的值表示空白单元格。 单元格 0 的值表示空白墙。 注意:只有一个来源和一个目的地。 输入的第一行是一个整数 T,表示测试用例的数量。然后是 T 测试用例。每个测试用例由 2 行组成。每个测试用例的第一行包含一个整数 N,表示方阵的大小。然后在下一行是矩阵 (M) 的 N*N 个空格分隔值。

 #include <stdio.h>
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>

using namespace std;

bool inside(int first, int second,int r)
{
    if(first<r && second<r && first>=0 && second>=0)
    {
        return true;
    }
    return false;
}
int isPath(pair <int, int> source, pair <int,int> dest, vector <vector<int>> &adj, vector <vector <bool>> &visit, int r)
{
    queue <pair<int,int>> q;
    q.push(source);
    while(!q.empty())
    {
        pair <int, int> curr = q.front();
        q.pop();
        if(inside(curr.first,curr.second,r) && !visit[curr.first][curr.second] && adj[curr.first][curr.second]==2)
        {
            return 1;
        }
        if(inside(curr.first+1,curr.second,r) && (adj[curr.first+1][curr.second]==3||adj[curr.first+1][curr.second]==2) && !visit[curr.first+1][curr.second])
        {
            curr.first++;
            q.push(curr);
            visit[curr.first][curr.second]=true;
            curr.first--;
        }
        if(inside(curr.first-1,curr.second,r) && (adj[curr.first-1][curr.second]==3||adj[curr.first-1][curr.second]==2) && !visit[curr.first-1][curr.second])
        {
            curr.first--;
            q.push(curr);
            visit[curr.first][curr.second]=true;
            curr.first++;
        }
        if(inside(curr.first,curr.second+1,r) && (adj[curr.first][curr.second+1]==3||adj[curr.first][curr.second+1]==2) && !visit[curr.first][curr.second+1])
        {
            curr.second++;
            q.push(curr);
            visit[curr.first][curr.second]=true;
            curr.second--;
        }
        if(inside(curr.first,curr.second-1,r) && (adj[curr.first][curr.second-1]==3||adj[curr.first][curr.second-1]==2) && !visit[curr.first][curr.second-1])
        {
            curr.second--;
            q.push(curr);
            visit[curr.first][curr.second]=true;
            curr.second++;
        }

    }
    return 0;
}
int main() {
    int r,c,t,i,j;
    vector <vector <int>> adj(r, vector <int>(c));
    vector <vector <bool>> visit(r, vector <bool>(c));
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            visit[i][j]=false;
        }
    }
    cin>>t;
    int p=t;
    vector <int> store(t);
    pair <int,int> source;
    pair <int,int> dest;
    while(t--)
    {
        cin>>r;
        for(i=0;i<r;i++)
        {
            for(j=0;j<r;j++)
            {
                cin>>adj[i][j];
            }
        }
        for(i=0;i<r;i++)
        {
            for(j=0;j<r;j++)
            {
                if(adj[i][j]==1)
                {
                    source.first=i;
                    source.second=j;
                }
                if(adj[i][j]==2)
                {
                    dest.first=i;
                    dest.second=j;  
                }
            }
        }
        int k=0, max=0;
        store[t-1]=isPath(source, dest, adj, visit,r);
    }
    for(i=0;i<p;i++)
    {
        cout<<store[i];
    }
    return 0;
}

【问题讨论】:

    标签: c++ graph breadth-first-search


    【解决方案1】:
    int r,c,t,i,j;
    vector <vector <int>> adj(r, vector <int>(c));
    vector <vector <bool>> visit(r, vector <bool>(c));
    

    在初始化它们之前使用rc。您应该首先读取值,然后初始化向量。例如:

    int r,c,t,i,j;
    // Declare vectors but don't initialize yet
    vector <vector <int>> adj;
    vector <vector <bool>> visit;
    
    // Later
    cin >> r;
    cin >> c;
    
    adj = vector <vector <int>>(r, vector <int>(c));
    visit = vector <vector <bool>>(r, vector <bool>(c));
    

    当您遍历向量时,您正在使用 rr 作为 for 循环限制。你的意思是rc

    【讨论】:

    • 愚蠢的我,我纠正了我的错误。谢谢你。但是,我的代码仍然针对一个小矩阵运行,但在更大的方阵的情况下再次抛出 SIGABRT 错误。如果有一些逻辑错误,请帮助我。
    【解决方案2】:

    您必须初始化rc。在这种情况下,rc 可能非常大。

    【讨论】:

    • 不明白,用init是什么意思。如果您能澄清一下,那将很有帮助。我的代码正在为小矩阵运行,但在较大的方阵的情况下再次抛出 SIGABRT 错误。
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多