我正在一个迷宫程序中为我的寻径实现图形 struct .在一些操作中,比如:遍历图,释放图(之前被malloc删除,或者使用广度优先搜索,…需要判断是否访问了顶点.

这是vertexedge struct :

typedef struct graph
{
    // val just use to label the vertex
    int val;

    // since the maze just has 4 directions,
    // I simplify vertex to just point to 4 other vertices
    edge up;
    edge down;
    edge left;
    edge right;
}vertex;

typedef struct Edge
{
    int weight;
    vertex *neighbour;
    bool visited;
}edge;

我想到了两种解决方案.第一个是在vertexedge struct 中添加bool visited;,并将其初始化为false,但它只能使用1次,因为我不知道如何重新初始化visited.第二种方法是制作一个链接列表,将访问的顶点放在该列表中,并在需要时判断该列表中的访问顶点.但是,当有数百个顶点时,它需要花费大量的工作.

那么,判断顶点是否被访问的好机制是什么?解决这个问题的更好方法是什么?

任何帮助都将不胜感激.

推荐答案

对于第一个解决方案,您可以向"边"和"顶点"添加"已访问的对象",并且每当您访问某个对象时,都会将其添加到链接列表中.因此,当您完成并希望将其重新初始化为false时,您只需在链接列表上传递一次,并更新其值,然后清除链接列表.

另一种解决方案是,当你访问一个 node 或一条边时,你把它们放在一个平衡的二叉搜索树(映射、设置……或你自己实现的东西)中,这些允许你添加一个元素或判断O(log(n))中是否存在一个元素,其中n是元素的总数.

C++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

在函数中使用复合文字来初始化C语言中的变量

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

理解C版宏(看起来像未声明的变量?)

GDB输出ARM助记符

X64:并发写入布尔数组

处理来自浏览器的HTTP请求

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

将非连续物理内存映射到用户空间

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

发送和接收的消息中的Unix域套接字不匹配

如何使用calloc和snprintf

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

将char*数组深度复制到 struct 中?

在C中使用字符串时是否不需要内存分配?

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

将指针的地址加载到寄存器内联拇指组件中

这些表达式是否涉及 C 中定义的复合文字?

使用复合文字数组初始化的指针数组

Codewars Kata 掷骰子的不稳定行为