一、前言
本文以上文动态规划法为基础按照相似的输入来完成编程。
二、代码思路
因为是贪心法,直接去找离目前正在遍历的点最近的点,因此输入了一个二维矩阵,咱们还需要设置一个一维数组来存/检验是否遍历过点,遍历过就不要再算了。并再设置一个一维数组,存这个点的前驱,方便最后输出结果。
由于贪心法比较符合人类正常思维方式,比较简单,不再赘述,直接上代码。
package main
import "fmt"
func main() {
var N int
fmt.Print("请输入(城市)点数: ")
fmt.Scanln(&N)
arc := make([][]int, N) //那个矩阵
for i := 0; i < N; i++ {
arc[i] = make([]int, N)
}
flag := make([]bool, N) //是否遍历了的矩阵
fin := make([]int, N+1) //存最终结果
finSum := 0
for i := 0; i < N; i++ {
flag[i] = false
fin[i] = -1
}
// 从控制台读取二维数组的值
fmt.Println("请输入二维数组的元素,每行输入完毕后空格按回车键:")
for i := 0; i < N; i++ {
for j := 0; j < N; j++ {
var putin int
fmt.Scanf("%d", &putin)
if putin == 0 {
putin = 2004
}
arc[i][j] = putin
}
fmt.Scanln() // 跳过每行输入后的换行符
}
//fmt.Println(arc)
var start int
fmt.Print("请输入起点城市id(从1开始): ")
fmt.Scanln(&start)
fin[0] = start
flag[start-1] = true
dot := start - 1 //正在查找的基准点
for i := 0; i < N; i++ {
min := 100
flagPoint := -1
for j := 0; j < N; j++ {
if flag[j] == true {
continue
}
if arc[dot][j] < min {
min = arc[dot][j] //寻找和i最近的点
flagPoint = j
}
}
if flagPoint == -1 {
break
}
finSum += min
flag[flagPoint] = true //证明检查过了
fin[i+1] = flagPoint + 1 //加入最终答案路径
dot = flagPoint
fmt.Println(fin[i], "->", fin[i+1])
}
fin[N] = start //补充回到起点
fmt.Println(fin[N-1], "->", fin[N])
finSum += arc[fin[N]-1][fin[N-1]-1]
fmt.Println(finSum)
fmt.Println(fin)
}
/*
5
0 3 3 2 6
3 0 7 3 2
3 7 0 2 5
2 3 2 0 3
6 2 5 3 0
*/