- 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;
+ }