p(1) = current;
时间: 2024-03-22 18:39:37 浏览: 60
在 MATLAB 中,数组的下标索引从 1 开始,因此 `p(1)` 表示数组 `p` 的第一个元素。
在上面的代码中,`p` 数组的初始值都被赋值为 NaN,因此需要在最后将起点存储在 `p` 数组的第一个元素中,表示起点是最短路径上的第一个节点。
具体实现过程可以参考以下代码:
```matlab
function p = get_path(cameFrom, current)
inds = find_nonempty(cameFrom);
p = nan(1, length(inds));
i = length(inds);
while isKey(cameFrom, current)
p(i) = current;
current = cameFrom(current);
i = i - 1;
end
p(1) = current;
end
```
该函数会首先调用 `find_nonempty` 函数获取非空元素的索引,然后利用 `nan` 函数创建一个初始值为 NaN 的数组 `p`,用于存储最短路径上的节点。
接着,从终点开始倒序遍历每个节点的前驱节点,将它们存储在 `p` 数组中,并返回最短路径。在存储节点时,需要注意数组 `p` 的索引与字典 `cameFrom` 中节点的索引是反向的,因此需要从数组末尾开始存储节点。最后,需要将起点存储在 `p` 数组的第一个元素中,表示起点是最短路径上的第一个节点。
相关问题
function p = get_path(cameFrom, current) % Returns the path. This function is only called once and therefore % does not need to be extraordinarily efficient inds = find(cameFrom); p = nan(1, length(inds)); p(1) = current; next = 1; while any(current == inds) current = cameFrom(current); next = next + 1; p(next) = current; end p(isnan(p)) = []; end
这段代码实现了 A* 算法中找到最短路径的功能。具体来说,输入参数 cameFrom 是一个 n-by-n 的矩阵,其中第 i 行代表从节点 i 出发时所经过的最优前驱节点,如果节点 i 没有前驱,则 cameFrom(i) = 0。current 是终点节点的编号。函数首先通过 find 函数找到 cameFrom 中所有非零元素所对应的节点编号,然后创建了一个长度为非零元素个数的 NaN 数组 p,其中 p(1) 被赋值为 current,表示路径的起点。接下来,while 循环中的语句不断将当前节点 current 更新为它的前驱节点 cameFrom(current),并将其存入 p(next) 中,直到找到路径的起点为止。最后,将 p 中的 NaN 元素去掉,并返回结果 p。
需要注意的是,在 A* 算法中,每个节点都有一个启发式估价函数 f(n),它等于从起点出发到节点 n 的实际代价 g(n) 加上从节点 n 到终点的估价 h(n)。在这段代码中,没有给出 f(n) 和 h(n) 的具体实现,因此很可能是在别的地方定义并传入了这两个函数。
#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *link; }JD; main() {JD *h,*f; int j,x; h=(JD*)malloc(sizeof(JD)); /*生成表头结点*/ h->data=0; f=h; for(j=1;j<=5;j++) /*调用lbcr函数生成具有5个结点的单链表*/ {scanf("%d",&x); f=lbsc(f,x);} for(j=1;j<=5;j++) /*输出生成的单链表*/ {h=h->link;printf("%d,",h->data);} printf("\n"); } lbsc (JD *p,int x) { JD *s; s=(JD*)malloc(sizeof(JD)); s->data=x; p->link=s; return s;} typedef struct node node*insert(node * head, int x) { node * last, * current, * p; //要插入的结点 p = (node *)malloc(sizeof(node)); p->num = x; //空表插入 if(head == NULL) { head = p; p->next = NULL; return head; } //找插入位置 current = head; while(x > current->num && current->next != NULL) { last = current; current = current->next; } if(x <= current->num) { if(head == current)//在第一结点之前插入 { p->next = head; head = p; return head; } else//中间位置插入 { p->next = current; last->next = p; return head; } } }
这段代码包含两个函数,第一个函数是 lbsc,它接受一个 JD 类型的指针 p 和一个 int 类型的数据 x,返回一个 JD 类型的指针。函数的作用是生成一个单链表,并将 x 插入到链表的最后一个节点后面。第二个函数是 insert,它接受一个 node 类型的指针 head 和一个 int 类型的数据 x,返回一个 node 类型的指针。函数的作用是将 x 插入到一个已排序的链表中,使得链表仍然保持有序。如果链表为空,则将 x 插入到链表的头部;如果链表不为空,则找到 x 在链表中的位置,并将其插入到该位置之前或之后。
阅读全文
相关推荐















