Euler_81.go (1770B)
1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "strings" 7 "strconv" 8 ) 9 10 type Node struct { 11 cost int 12 distance int 13 included bool 14 } 15 16 func dijkstra(matrix [][]Node) int { 17 for count := 0; count < (80 * 80) - 1; count++ { 18 min := 1<<31 - 1 19 var min_x int 20 var min_y int 21 22 for x := 0; x < 80; x++ { 23 for y := 0; y < 80; y++ { 24 if matrix[x][y].included == false && matrix[x][y].distance <= min { 25 min = matrix[x][y].distance 26 min_x = x 27 min_y = y 28 } 29 } 30 } 31 32 matrix[min_x][min_y].included = true 33 34 for x := 0; x < 80; x++ { 35 for y := 0; y < 80; y++ { 36 if x + 1 < 80 { 37 if (!matrix[x + 1][y].included) && matrix[x][y].distance != 1<<31 - 1 && matrix[x][y].distance + matrix[x + 1][y].cost < matrix[x + 1][y].distance { 38 matrix[x + 1][y].distance = matrix[x][y].distance + matrix[x + 1][y].cost 39 } 40 } 41 42 43 if y + 1 < 80 { 44 if (!matrix[x][y + 1].included) && matrix[x][y].distance != 1<<31 - 1 && matrix[x][y].distance + matrix[x][y + 1].cost < matrix[x][y + 1].distance { 45 matrix[x][y + 1].distance = matrix[x][y].distance + matrix[x][y + 1].cost 46 } 47 } 48 } 49 } 50 } 51 52 return matrix[79][79].distance 53 } 54 55 func main() { 56 dat, _ := ioutil.ReadFile("./files/matrix_81.txt") 57 58 var matrix [][]Node 59 60 for _, r := range strings.Split(string(dat), "n") { 61 var int_row []Node 62 63 for _, r2 := range strings.Split(r, ",") { 64 var n Node 65 cost, _ := strconv.Atoi(r2) 66 n.cost = cost 67 n.distance = 1<<31 - 1 68 n.included = false 69 int_row = append(int_row, n) 70 } 71 72 matrix = append(matrix, int_row) 73 } 74 75 matrix[0][0].distance = matrix[0][0].cost 76 fmt.Println(dijkstra(matrix)) 77 }