Advertisement
Guest User

Untitled

a guest
Oct 24th, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.56 KB | None | 0 0
  1. package example
  2.  
  3. object Matrix extends App {
  4.   type Matrix = Array[Array[Int]]
  5.  
  6.   def printMatrix(m: Matrix) =
  7.     for (l <- m) println(l.mkString(", "))
  8.  
  9.   def solve(N: Matrix, m: Int): (Matrix, Matrix) = {
  10.     val n = N.length
  11.  
  12.     var M: Matrix = Array.ofDim[Int](m, m)
  13.     var MN: Matrix = Array.ofDim[Int](m, n)
  14.  
  15.     val k = n - m
  16.  
  17.     for (r <- 0 until n) {
  18.       val mn_r = if (r > k) r - k else 0
  19.  
  20.       for (c <- 0 until n) {
  21.         // заполняем MN
  22.         if (mn_r == 0) // первый ряд просто накапливает сумму
  23.           MN(mn_r)(c) = MN(0)(c) + N(r)(c)
  24.         else // следующие ряды берут сумму из ячейки выше, и обновляют её
  25.           MN(mn_r)(c) = MN(mn_r - 1)(c) + N(r)(c) - N(mn_r - 1)(c)
  26.  
  27.         if (r >= k) {
  28.           // заполняем M
  29.           val m_c = if (c > k) c - k else 0
  30.           if (m_c == 0)
  31.             M(mn_r)(m_c) = M(mn_r)(0) + MN(mn_r)(c)
  32.           else
  33.             M(mn_r)(m_c) = M(mn_r)(m_c - 1) + MN(mn_r)(c) - MN(mn_r)(m_c - 1)
  34.         }
  35.       }
  36.     }
  37.  
  38.     (MN, M)
  39.   }
  40.  
  41.   def go(m: Matrix, k: Int) = {
  42.     printMatrix(m)
  43.     println()
  44.     val t = solve(m, k)
  45.     printMatrix(t._1)
  46.     println()
  47.     printMatrix(t._2)
  48.   }
  49.  
  50.   val m1: Matrix =
  51.     Array(
  52.       Array(1, 1, 1, 1, 1),
  53.       Array(2, 2, 2, 2, 2),
  54.       Array(3, 3, 3, 3, 3),
  55.       Array(4, 4, 4, 4, 4),
  56.       Array(5, 5, 5, 5, 5))
  57.  
  58.   val m2 = Array(
  59.     Array(1, 2, 3),
  60.     Array(4, 5, 6),
  61.     Array(7, 8, 9))
  62.  
  63.   go(m1, 3)
  64.   go(m2, 2)
  65.  
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement