Euler_83.go (2354B)
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 if y + 1 < 80 { 43 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 { 44 matrix[x][y + 1].distance = matrix[x][y].distance + matrix[x][y + 1].cost 45 } 46 } 47 48 if x - 1 >= 0 { 49 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 { 50 matrix[x - 1][y].distance = matrix[x][y].distance + matrix[x - 1][y].cost 51 } 52 } 53 54 if y - 1 >= 0 { 55 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 { 56 matrix[x][y - 1].distance = matrix[x][y].distance + matrix[x][y - 1].cost 57 } 58 } 59 } 60 } 61 } 62 63 return matrix[79][79].distance 64 } 65 66 func main() { 67 dat, _ := ioutil.ReadFile("./files/matrix_83.txt") 68 69 var matrix [][]Node 70 71 for _, r := range strings.Split(string(dat), "n") { 72 var int_row []Node 73 74 for _, r2 := range strings.Split(r, ",") { 75 var n Node 76 cost, _ := strconv.Atoi(r2) 77 n.cost = cost 78 n.distance = 1<<31 - 1 79 n.included = false 80 int_row = append(int_row, n) 81 } 82 83 matrix = append(matrix, int_row) 84 } 85 86 matrix[0][0].distance = matrix[0][0].cost 87 88 fmt.Println(dijkstra(matrix)) 89 }