package main import ( "fmt" "strconv" "log" "encoding/csv" "strings" "io" "os" ) /* Cette fonction est inutile, c'est juste que j'ai réfléchis dans ma tête de haut en bas, j'avais pas envie de réfléchir de gauche à droite */ func trans( r [][]int ) { for i := range r { for j := 0 ; j < i ; j++ { r[i][j], r[j][i] = r[j][i], r[i][j] } } } func extractRecord( record []string ) []int { row := make([]int, len(record)) for i := range record { if v, err := strconv.Atoi(strings.TrimSpace(record[i])) ; err == nil { row[i] = v } else { log.Fatalln(err) } } return row } func min( nums ...int) int { min := nums[0] for _, num := range nums[1:] { if num < min { min = num } } return min } func main() { file, err := os.Open("p082_matrix.txt") if err != nil { log.Fatal(err) } r := csv.NewReader(file) record, err := r.Read() array := make([][]int, 0) for ; err == nil ; record, err = r.Read() { array = append( array, extractRecord( record ) ) } if err != io.EOF && err != nil { log.Fatal(err) } trans(array) minArray := make([][]int, 0) for row := range array { if row == 0 { minArray = append(minArray, array[0]) continue } minRow := make([]int, len(array[row])) minRow[0] = minArray[row-1][0] + array[row][0] // Un allez for i := 1 ; i < len(minRow) ; i++ { minRow[i] = min( minArray[row-1][i], minRow[i-1]) + array[row][i] } // Un retour ! for i:= len(minRow) - 2 ; i >= 0 ; i-- { minRow[i] = min( minRow[i], minRow[i+1] + array[row][i] ) } minArray = append(minArray, minRow) } // Ça c'est HYPER classe ! fmt.Println(min(minArray[len(minArray)-1]...)) }