很早就听说过A*算法,据说在寻路径时,是一种比较高效的算法。但是一直没有搞清楚原理。 这段时间刚好有个营救公主的例子: 题描述 : 公主被魔王抓走了 , 王子需要拯救出美丽的公主 。 他进
顺晟科技
2021-08-28 09:41:12
58
问题说明:有一系列数字1至5,根据以下顺序要求重新排列和打印。要求如下:2出现在5前,3出现在2前,4出现在1前,1出现在3前。
这是一个非常常见的拓扑排序问题。常见的拓扑排序解决方法是使用DFS-深度优先级算法。我对DFS算法的浅理解是递归。因为拓扑排序问题本身有一些先决条件(本文不详细说明拓扑算法的定义),所以解决这个问题有以下想法:
将排序要求声明为map(map的key,value视为顺序的要求,key必须出现在value之前),重复1-5在map中查找key,如果有的话,在map中单击key,value的关系,然后从map[key]中获取的vey以下是使用Golang实现上述问题的方法。
[py] view plaincopy
Package main
Import(
“Fmt”
' Strconv '
)。
//edge请求顺序
var edge map[string]string=map[string]string {
2': '5 ',
3': '2 ',
4': '1 ',
1': '3 ',
}
Func main() {
//结果阵列
Var q []string=make([]string,0)
//访问的数组
varvisited[]string=make([]string,0)
FOR I :=0;I 5;I {
Tupusort (q,visited,strconv.itoa (I))
}
//fmt . printf(‘visited 3360% v \ n’,visited)
Reverse(q)
fmt . printf(“topusort 3360% v \ n”,q)
}
//拓扑对齐-DFS
Functup usort (q * [] string,visited * [] string,element string) {
If!IsVisited(visited,element) {
* visited=append (* visited,element)
If edge[element]!='' {
Tup usort (q,visited,edge [element])
}
*q=append(*q,element)
}
}
//确认您在访问的数组中
Funcis visited (visited * [] string,element string) bool {
Var isVisited bool=false
For _,item3360=range * visited {
If item==element {
IsVisited=true
布雷克
}
}
Return isVisited
}
//反转阵列顺序
Func reverse(arr []string) {
For i,j :=0,LEN(ARR)-1;I J;I,j=I 1,j-1 {
Arr[i],arr[j]=arr[j],arr[i]
}
}
最终输出如下
topusort 3360[4 1 3 2 5 0]
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08