如何删除我的 C++ 代码中的 SIGABRT 错误
How to remove SIGABRT error in my C++ code
我的任务是查找给定图形(邻接矩阵)中是否存在从源到目的地的路径。源为 1,目的地为 2,路径只能通过矩阵中的数字 3。我已经使用 BFS 解决了这个问题,但我收到了 SIGABRT 错误。如果有人可以帮助我,我仍然是编码的初学者。我在这里附上了代码。
题目如下 给定一个由 1, 0, 2, 3 填充的 N X N 矩阵 (M)。任务是在仅遍历空白单元格的情况下,找出是否存在从源到目的地的可能路径。可以上下左右遍历
单元格 1 的值表示来源。
单元格 2 的值表示目标。
单元格 3 的值表示空白单元格。
单元格 0 的值表示空白墙。
注意:只有一个来源和一个目的地。
输入的第一行是一个整数 T,表示测试用例的数量。然后是 T 个测试用例。每个测试用例由 2 行组成。每个测试用例的第一行包含一个整数 N,表示方阵的大小。然后在下一行是矩阵 (M).
的 N*N space 分隔值
#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;
}
您必须初始化 r
和 c
。在这种情况下 r
和 c
可能会很大。
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
吗?
我的任务是查找给定图形(邻接矩阵)中是否存在从源到目的地的路径。源为 1,目的地为 2,路径只能通过矩阵中的数字 3。我已经使用 BFS 解决了这个问题,但我收到了 SIGABRT 错误。如果有人可以帮助我,我仍然是编码的初学者。我在这里附上了代码。 题目如下 给定一个由 1, 0, 2, 3 填充的 N X N 矩阵 (M)。任务是在仅遍历空白单元格的情况下,找出是否存在从源到目的地的可能路径。可以上下左右遍历
单元格 1 的值表示来源。 单元格 2 的值表示目标。 单元格 3 的值表示空白单元格。 单元格 0 的值表示空白墙。 注意:只有一个来源和一个目的地。 输入的第一行是一个整数 T,表示测试用例的数量。然后是 T 个测试用例。每个测试用例由 2 行组成。每个测试用例的第一行包含一个整数 N,表示方阵的大小。然后在下一行是矩阵 (M).
的 N*N space 分隔值 #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;
}
您必须初始化 r
和 c
。在这种情况下 r
和 c
可能会很大。
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
吗?