我一直在尝试使用2D数组作为函数的Reference。谢谢你的帮助。
#include <iostream>
using namespace std;
void dfs(int *G[],int i,int *visited,int size) {
visited[i]=1;
int j;
for(j=0;j<size;j++) {
if(!visited[j]&& G[i][j] == 1)
dfs(G,j,visited);
}
}
答案 0 :(得分:1)
问题在于您的dfs
功能
void dfs(int *G[],int i,int *visited)
它指向指向int
的指针。然而,您正在将数组传递给它
dfs(Array_From_file, 0, visited);
其中Array_From_file
被声明为
int Array_From_file[ROWS][COLUMNS];
这种转换是不可能的。快速修复:将函数的签名更改为:
void dfs(int G[][COLUMNS],int i,int *visited)
更好的是,使用您通过引用传递的std::vector<std::vector<int>>
。这是一个例子:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int const COLUMNS = 100;
int const ROWS = 100 ;
typedef std::vector<std::vector<int>> int_mat;
void dfs(const int_mat& G, int i, vector<int>& visited) {
int size = ROWS * COLUMNS ;
visited[i] = 1;
for (int j = 0; j < size; j++) {
if (!visited[j] && G[i][j] == 1)
dfs(G, j, visited);
}
}
答案 1 :(得分:-1)
我相信你的(经过大量编辑的)修复是这样的:
int one_to_two(int* a, int x, int y)
{
return a[x*ROWS+y];
}
void dfs(int** G,int i,int *visited) {
int size = ROWS * COLUMNS ;
visited[i]=1;
int j;
for(j=0;j<size;j++) {
if(!visited[j]&& one_to_two(G,i,j) == 1)
dfs(G,j,visited);
}
}
话虽如此,我并不认为这是解决这个问题的结构良好的方法。我不知道你为什么要使用递归来做这个,迭代循环会简单得多。该方法有可能使堆叠爆炸。你不是在这里使用尾递归,所以如果ROWS或COLUMNS变得很大,这个方法会引起内存问题。
我为自己的搞砸而道歉,打字并没有像我想象的那样奏效。这需要在将2-d数组发送到函数之前将其转换为int指针。我不确定我喜欢这个解决方案,它不是很优雅,但它至少应该编译。
另一方面,我不太确定你尝试使用深度优先搜索做什么,但我不认为这个算法完全符合你的想法(对于一个,malloc没有&# 39; t将它分配的内存归零,这是该算法特别关注的问题)