+func InitializeStateTable(data planet_data, dims []int) []State {
+ table := make([]State, StateTableSize(dims))
+
+ addr := make([]int, NumDimensions)
+ addr[Fuel] = *fuel
+ addr[Edens] = *start_edens
+ addr[Location] = data.p2i[*start]
+ table[EncodeIndex(dims, addr)].value = *funds
+
+ return table
+}
+
+/* These four fill procedures fill in the cell at address addr by
+ * looking at all the possible ways to reach this cell and selecting
+ * the best one.
+ *
+ * The other obvious implementation choice is to do this the other way
+ * around -- for each cell, conditionally overwrite all the other cells
+ * that are reachable *from* the considered cell. We choose gathering
+ * reads over scattering writes to avoid having to take a bunch of locks.
+ */
+
+func UpdateCell(table []State, here, there, value_difference int) {
+ possible_value := table[there].value + value_difference
+ if table[there].value > 0 && possible_value > table[here].value {
+ table[here].value = possible_value
+ table[here].from = there
+ }
+}
+
+func FillCellByArriving(data planet_data, dims []int, table []State, addr []int) {
+ my_index := EncodeIndex(dims, addr)
+ other := make([]int, NumDimensions)
+ copy(other, addr)
+
+ /* Travel here via a 2-fuel unit jump */
+ if addr[Fuel]+2 < dims[Fuel] {
+ other[Fuel] = addr[Fuel] + 2
+ for other[Location] = 0; other[Location] < dims[Location]; other[Location]++ {
+ UpdateCell(table, my_index, EncodeIndex(dims, other), 0)
+ }
+ other[Location] = addr[Location]
+ other[Fuel] = addr[Fuel]
+ }
+
+ /* Travel here via a hidey hole */
+ if addr[Fuel]+1 < dims[Fuel] {
+ hole_index := (dims[Fuel] - 1) - (addr[Fuel] + 1)
+ if hole_index < len(flight_plan()) {
+ other[Fuel] = addr[Fuel] + 1
+ other[Location] = data.p2i[flight_plan()[hole_index]]
+ UpdateCell(table, my_index, EncodeIndex(dims, other), 0)
+ other[Location] = addr[Location]
+ other[Fuel] = addr[Fuel]
+ }
+ }
+
+ /* Travel here via Eden Warp Unit */
+ for other[Edens] = addr[Edens] + 1; other[Edens] < dims[Edens]; other[Edens]++ {
+ for other[Location] = 0; other[Location] < dims[Location]; other[Location]++ {
+ UpdateCell(table, my_index, EncodeIndex(dims, other), 0)
+ }