小馬過河,尋找最短路徑

題目看截圖算法

圖片描述

算法以下數組

package main

import (
    "fmt"
    "sort"
)
func jz(arr [][]int) int{
    // 聲明全部數字的和
    sum:=0;
    // 獲取矩陣行數 此例中的l=5
    l := len(arr)
    for i:=0;i<l;{
        // 這裏利用sort.Ints對數組進行由小到大排序
        sort.Ints(arr[i])

        // 若是i==0 第一行的狀況下 直接將排序後的數組第一個數字的值累加到sum
        if i==0 {
            sum+=arr[i][0]
        }

        // 這裏就是嘗試往下跳1步 和 2步比較那個的和最小
        if i+1<l && i+2<l {

            sort.Ints(arr[i+1])
            sort.Ints(arr[i+2])
            temp:=arr[i+1][0]+arr[i+2][0];

            //比較後二者的和 和 兩個值的關係。若是和小於二者的任何一個那就選擇跳1步
            if arr[i+1][0]>temp && arr[i+2][0]>temp {
                sum+=arr[i+1][0]
                i++
            }else{
                //判斷從當前指針位置,向後數1 和向後數2兩個位置數字的大小,選擇較小的
                if arr[i+1][0]>arr[i+2][0] {
                    //此時是向下1步比向下2步的要大,因此選擇第二個
                    sum+=arr[i+2][0];
                    i+=2
                }else{
                    sum+=arr[i+1][0];
                    i++
                }
            }
        }else if i+1<l{
            //臨界值處理,此時的i+2已經越界 不能選擇直接使用最後一個值就能夠了
            sort.Ints(arr[i+1])
            sum+=arr[i+1][0]
            break
        }
        // 上面的if else if的判斷條件的順序也是解決這個題的關鍵
    }
    return sum
}
func main() {
    //矩陣聲明5x5
    arr:=[][]int{
        {3,0,-2,4,0},
        {-1,2,-2,1,4},
        {3,1,-2,-3,3},
        {2,-4,-3,-3,2,},
        {5,2,-2,-3,1},
    }
    fmt.Println(arr)
    a:=jz(arr)
    fmt.Println("總數",a)
}
相關文章
相關標籤/搜索