Advertisement
Guest User

Untitled

a guest
Nov 24th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.10 KB | None | 0 0
  1. import math._
  2.  
  3. val exitfloor = 9
  4. val exitpos = 9
  5. val width = 19
  6. val nbfloors = 10
  7. val elevators = Map(0 -> List(3,9), 1 -> List(4,17), 2 -> List(3,9), 3 -> List(4,17), 4 -> List(3,9), 5 -> List(4,17), 6 -> List(3,9), 7 -> List(4,17), 8 -> List(9))
  8.  
  9. def getDirection(from: Int, to: Int): String =
  10.   if (from < to)
  11.     "RIGHT"
  12.   else
  13.     "LEFT"
  14.  
  15. def shortestRoute(fromFloor: Int, fromPos: Int, direction: String, ladders: Int): (Int, Map[Int, Int]) = {
  16.  
  17.   val floorElevators = elevators.getOrElse(fromFloor, Nil)
  18.  
  19.   def blockedExtra(toPos: Int) =
  20.     if (direction == "RIGHT" && fromPos > toPos || direction == "LEFT" && fromPos < toPos)
  21.       3
  22.     else
  23.       0
  24.  
  25.   if (fromFloor == exitfloor) {
  26.     (abs(fromPos - exitpos) + blockedExtra(exitpos), Map.empty)
  27.   }
  28.   else if (floorElevators contains fromPos) {
  29.     val next = shortestRoute(fromFloor + 1, fromPos, direction, ladders)
  30.     (next._1 + 1, next._2 + (fromFloor -> fromPos))
  31.   }
  32.   else {
  33.     val leftElevator = floorElevators.filter(fromPos >).lastOption
  34.     val rightElevator = floorElevators.find(fromPos <)
  35.     val leftmost = leftElevator.getOrElse(0)
  36.     val rightmost = rightElevator.getOrElse(width - 1)
  37.  
  38.     val ladderPositions: Seq[Int] = leftmost to rightmost
  39.     val elevatorPositions: Seq[Int] = leftElevator ++ rightElevator toSeq
  40.  
  41.     if (ladders == 0) {
  42.       if (elevatorPositions.isEmpty)
  43.         (nbfloors * width, Map.empty)
  44.       else
  45.         elevatorPositions.map(pos => {
  46.           val next = shortestRoute(fromFloor + 1, pos, getDirection(fromPos, pos), 0)
  47.           (blockedExtra(pos) + abs(pos - fromPos) + 1 + next._1, next._2 + (fromFloor -> pos))
  48.         }).minBy(_._1)
  49.     }
  50.     else
  51.       ladderPositions.map(pos => {
  52.         val newLadderCount = if (elevatorPositions contains pos) ladders else ladders - 1
  53.         val next = shortestRoute(fromFloor + 1, pos, getDirection(fromPos, pos), newLadderCount)
  54.         (blockedExtra(pos) + abs(pos - fromPos) + 1 + next._1, next._2 + (fromFloor -> pos))
  55.       }).minBy(_._1)
  56.   }
  57. }
  58. val solution = Array(9, 4, 3, 4, 3, 4, 3, 4, 9)
  59. shortestRoute(0, 6, "RIGHT", 0)._2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement