import scala.collection.mutable.TreeSet

object Main extends App {
  val sc = new FastScanner(System.in)
  val h, w, k = sc.nextInt()
  val x1, y1, x2, y2 = sc.nextInt()-1
  val c = Array.fill(h)(sc.next()).map(_.map(_ == '@').toArray)

  def compare(a: (Int, Int), b: (Int, Int)): Boolean = {
    if (a._1 == b._1) {
      a._2 < b._2
    } else {
      a._1 < b._1
    }
  }

  def shortestPath(sx: Int, sy: Int): Array[Array[Array[(Int, Int)]]] = {
    val sp = Array.fill(h, w, 4)((-1, 0))
    val dir = Array((1,0), (0,1), (-1,0), (0,-1))
    val candidates = TreeSet(((0, 0), (sx, sy, 0)))
    sp(sx)(sy)(0) = (0, 0)

    while (candidates.nonEmpty) {
      val next @ ((a, b), (x1, y1, d1)) = candidates.head
      candidates.remove(next)

      for (i <- -1 to 1) {
        val d2 = (d1+i+4) % 4
        val (x2, y2) = if (i == 0) {
          (x1 + dir(d2)._1, y1 + dir(d2)._2)
        } else {
          (x1, y1)
        }

        if (i != 0 || (0 <= x2 && x2 < h && 0 <= y2 && y2 < w && !c(x2)(y2))) {
          val costOld = sp(x2)(y2)(d2)
          val costNew = if (i == 0) {
            if (b == k-1) (a+1, 0) else (a, b+1)
          } else {
            if (b == 0) (a, 0) else (a+1, 0)
          }

          if (costOld._1 == -1) {
            sp(x2)(y2)(d2) = costNew
            candidates.add(costNew, (x2, y2, d2))
          } else if (compare(costNew, costOld)) {
            sp(x2)(y2)(d2) = costNew
            candidates.remove(costOld, (x2, y2, d2))
            candidates.add(costNew, (x2, y2, d2))
          }
        }
      }
    }
    sp
  }

  val sp = shortestPath(x1, y1)
  println(sp(x2)(y2).map{case (a, b) => a + (if (b == 0) 0 else 1)}.min)
}

class FastScanner(source: java.io.InputStream) {
  val buf = new Array[Byte](1024)
  var now, end = 0

  def isPrintable(b: Byte): Boolean = 33 <= b && b <= 126
  def isNum(b: Byte): Boolean = 48 <= b && b <= 57

  def hasNextByte: Boolean = {
    if (now < end) {
      true
    } else {
      now = 0
      end = source.read(buf)
      end > 0
    }
  }

  def nextByte(): Byte = {
    if (hasNextByte) {
      val b = buf(now)
      now += 1
      b
    } else {
      -1
    }
  }

  def hasNext: Boolean = {
    while (hasNextByte && !isPrintable(buf(now))) {
      now += 1
    }
    hasNextByte
  }

  def next(): String = {
    if (hasNext) {
      val sb = new StringBuilder()
      var b = nextByte()
      while (isPrintable(b)) {
        sb += b.toChar
        b = nextByte()
      }
      sb.toString
    } else {
      throw new NoSuchElementException()
    }
  }

  def nextInt(): Int = {
    nextLong().toInt
  }

  def nextLong(): Long = {
    if (hasNext) {
      var b = nextByte()
      var sign = 1
      var n = 0L
      if (b == '-') {
        sign = -1
        b = nextByte()
      }
      while (isNum(b)) {
        n = n * 10 + (b - 48)
        b = nextByte()
      }
      sign * n
    } else {
      throw new NoSuchElementException()
    }
  }

  def nextDouble(): Double = next().toDouble
}
