考虑到你提供的条件,编写代码不需要超过40行。
实质上,你只需继续访问与当前正在检查的节点相连的节点。一旦确定没有新的节点需要访问,就会回溯跟踪。
此外,你还需要找到一些方法来跟踪你走过的路径,以便到达当前节点。在这个例子中,我将这些信息放入了栈中,以免出现一些内存管理问题。
#include <stdio.h>
#define N_NODES 4
#define NAME_OFFSET 1
int edges[N_NODES][N_NODES] = {
{ 0, 1, 1, 0 },
{ 1, 0, 1, 0 },
{ 1, 1, 0, 0 },
{ 0, 0, 0, 0 }
};
int visited[N_NODES] = { 0, 0, 0, 0 };
struct Node {
int node;
struct Node *prev;
};
void visit(int node, struct Node *prev_node) {
struct Node n = { node, prev_node };
struct Node *p = &n;
do
printf("%d%s", p->node + NAME_OFFSET, (p->prev != NULL)? "->" : "\n");
while ((p = p->prev) != NULL);
visited[node]=1;
int i;
for (i = 0; i < N_NODES; ++i)
if ((visited[i] == 0) && (edges[node][i] == 1))
visit(i, &n);
visited[node] = 0;
}
int main (int argc, char *argv[]) {
int i;
for (i = 0; i < N_NODES; ++i) {
visit(i, NULL);
}
return 0;
}
生成:
1
2->1
3->2->1
3->1
2->3->1
2
1->2
3->1->2
3->2
1->3->2
3
1->3
2->1->3
2->3
1->2->3
4
我想这就是你在寻找的内容。
在it技术方面,我猜这就是你想要的。