Bagaimana cara menghilangkan kesalahan SIGABRT dalam kode C++ saya

Tugas saya adalah menemukan apakah ada jalur dari sumber ke tujuan dalam grafik tertentu (matriks ketetanggaan). Sumbernya 1 dan tujuannya 2 dan jalur hanya dapat melalui nomor 3 dalam matriks. Saya telah menggunakan BFS untuk mengatasi masalah ini tetapi saya mendapatkan kesalahan SIGABRT. Kalau ada yang bisa tolong bantu saya, saya masih pemula dalam coding. Saya telah melampirkan kode di sini. Pertanyaannya adalah sebagai berikut Diberikan matriks N X N (M) yang diisi dengan 1, 0, 2, 3. Tugasnya adalah menemukan apakah ada kemungkinan jalur dari sumber ke tujuan sambil melintasi sel kosong saja. Anda dapat melintasi ke atas, bawah, kanan, dan kiri.

Nilai sel 1 berarti Sumber. Nilai sel 2 berarti Tujuan. Nilai sel 3 berarti sel kosong. Nilai sel 0 berarti Dinding Kosong. Catatan: hanya ada satu sumber dan satu tujuan. Baris input pertama adalah bilangan bulat T yang menunjukkan jumlah kasus uji. Kemudian kasus uji T menyusul. Setiap test case terdiri dari 2 baris. Baris pertama dari setiap kasus uji berisi bilangan bulat N yang menunjukkan ukuran matriks persegi. Kemudian pada baris berikutnya adalah N*N nilai matriks (M) yang dipisahkan spasi.

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

person Ankesh Kumar Singh    schedule 18.06.2020    source sumber


Jawaban (2)


int r,c,t,i,j;
vector <vector <int>> adj(r, vector <int>(c));
vector <vector <bool>> visit(r, vector <bool>(c));

Anda menggunakan r dan c sebelum menginisialisasinya. Anda harus membaca nilainya terlebih dahulu, lalu menginisialisasi vektornya. Misalnya:

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

Anda menggunakan r dan r sebagai batas loop for saat Anda menelusuri vektor. Apakah maksud Anda r dan c?

person vll    schedule 18.06.2020
comment
Konyolnya aku, aku memperbaiki kesalahanku. Terima kasih. Tapi tetap saja, kode saya berjalan untuk matriks kecil tetapi sekali lagi menimbulkan kesalahan SIGABRT jika matriks persegi lebih besar. Jika Anda bisa tolong bantu saya jika ada kesalahan logis. - person Ankesh Kumar Singh; 18.06.2020
comment
@AnkeshKumarSingh ericlippert.com/2014/03/05/how -untuk-men-debug-program-kecil - person vll; 18.06.2020

Anda harus menginisialisasi r dan c. Dalam hal ini r dan c bisa sangat besar.

person Anton Shwarts    schedule 18.06.2020
comment
Saya tidak mengerti, apa yang dimaksud dengan menggunakan init. Jika Anda bisa menjelaskannya, itu akan sangat membantu. Kode saya berjalan untuk matriks kecil tetapi sekali lagi menimbulkan kesalahan SIGABRT jika matriks persegi lebih besar. - person Ankesh Kumar Singh; 18.06.2020