วิธีลบข้อผิดพลาด SIGABRT ในรหัส C ++ ของฉัน

งานของฉันคือค้นหาว่ามีเส้นทางจากต้นทางไปยังปลายทางในกราฟที่กำหนดหรือไม่ (เมทริกซ์คำคุณศัพท์) ต้นทางคือ 1 และปลายทางคือ 2 และเส้นทางสามารถเดินทางผ่านเลข 3 ในเมทริกซ์ได้เท่านั้น ฉันใช้ BFS เพื่อแก้ไขปัญหานี้ แต่ฉันได้รับข้อผิดพลาด SIGABRT หากใครสามารถช่วยฉันได้ฉันยังเป็นมือใหม่ในการเขียนโค้ด ฉันได้แนบรหัสที่นี่ คำถามมีดังนี้ เมื่อกำหนดเมทริกซ์ N X N (M) ที่เต็มไปด้วย 1, 0, 2, 3 งานคือค้นหาว่ามีเส้นทางที่เป็นไปได้จากต้นทางไปยังปลายทางหรือไม่ในขณะที่สำรวจผ่านเซลล์ว่างเท่านั้น คุณสามารถเคลื่อนที่ขึ้น ลง ขวา และซ้ายได้

ค่าของเซลล์ 1 หมายถึง แหล่งที่มา ค่าของเซลล์ 2 หมายถึงปลายทาง ค่าของเซลล์ 3 หมายถึงเซลล์ว่าง ค่าของเซลล์ 0 หมายถึงผนังว่าง หมายเหตุ: มีเพียงต้นทางและปลายทางเดียวเท่านั้น บรรทัดแรกของอินพุตคือจำนวนเต็ม T ซึ่งแสดงถึงไม่มีกรณีทดสอบ จากนั้นจะมีกรณีทดสอบ T ตามมา แต่ละกรณีทดสอบประกอบด้วย 2 บรรทัด บรรทัดแรกของกรณีทดสอบแต่ละกรณีจะมีจำนวนเต็ม N ซึ่งแสดงถึงขนาดของเมทริกซ์จตุรัส จากนั้นในบรรทัดถัดไปคือค่าที่คั่นด้วยช่องว่าง N*N ของเมทริกซ์ (M)

 #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 แหล่งที่มา


คำตอบ (2)


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

คุณใช้ r และ c ก่อนที่จะเริ่มต้น คุณควรอ่านค่าก่อน จากนั้นจึงเริ่มต้นเวกเตอร์ ตัวอย่างเช่น:

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

คุณกำลังใช้ r และ r เป็นขีดจำกัดการวนซ้ำ for เมื่อคุณผ่านเวกเตอร์ คุณหมายถึง r และ c ใช่หรือไม่

person vll    schedule 18.06.2020
comment
ฉันโง่ ฉันแก้ไขข้อผิดพลาดของฉัน ขอบคุณ แต่ถึงกระนั้น รหัสของฉันก็กำลังทำงานกับเมทริกซ์ขนาดเล็ก แต่มีข้อผิดพลาด SIGABRT อีกครั้งในกรณีของเมทริกซ์จตุรัสที่ใหญ่กว่า หากคุณสามารถช่วยฉันได้หากมีข้อผิดพลาดเชิงตรรกะ - person Ankesh Kumar Singh; 18.06.2020
comment
@AnkeshKumarSingh ericlippert.com/2014/03/05/how -to-debug-small-programs - person vll; 18.06.2020

คุณต้องเริ่มต้น r และ c ในกรณีนี้ r และ c อาจมีขนาดใหญ่มาก

person Anton Shwarts    schedule 18.06.2020
comment
ฉันไม่เข้าใจ การใช้ init หมายความว่าอย่างไร ถ้ากรุณาชี้แจงด้วยก็จะเป็นประโยชน์ รหัสของฉันกำลังทำงานสำหรับเมทริกซ์ขนาดเล็ก แต่มีข้อผิดพลาด SIGABRT อีกครั้งในกรณีของเมทริกซ์จตุรัสที่ใหญ่กว่า - person Ankesh Kumar Singh; 18.06.2020