}
/* we'll need to go to one of the three middles */
- int best1 = distance_middle(switch_from, 1) + distance_middle(switch_to, 1);
int best2 = distance_middle(switch_from, 2) + distance_middle(switch_to, 2);
- int best3 = distance_middle(switch_from, 3) + distance_middle(switch_to, 3);
- return std::min(std::min(best1, best2), best3) + distance_row(row_from, row_to);
+ int distrow = distance_row(row_from, row_to);
+ if ((switch_from > 3) != (switch_to > 3))
+ return best2 + distrow;
+ if (switch_from > 3) {
+ int best3 = distance_middle(switch_from, 3) + distance_middle(switch_to, 3);
+ return std::min(best2, best3) + distrow;
+ } else {
+ int best1 = distance_middle(switch_from, 1) + distance_middle(switch_to, 1);
+ return std::min(best2, best1) + distrow;
+ }
}
int optimistic_distance(int row_from, int switch_from, int row_to, int switch_to)