Problem:
Product Sale Lines

Problem

ウニクロ卯月さんと目黒凛さんはSEARIGHT LIVE FESの物販に来ている。下図のように、物販列は二列からなり、横にW人、縦にH人並べる大きさでコの字の形をしている。列の先頭の人は買い物をした後に列からはけ、同じ列の後ろの人々はそれぞれ一人分ずつ列を詰める。

二人は最初に物販列の最後尾に隣同士で、それぞれ違う列に（下図オレンジと濃い青色の位置）並んでいる。二人はとても仲がよいため、常にできるだけ近くにいたい。しかし、人のはけ方は列によって違うため、違う列に並んでいる二人の位置は離れてしまう可能性がある。

あなたの仕事は、列のはけ方が与えられたとき、二人が隣同士になる回数を求めることである。
ただし、二人ともコの字の角にいる（上図の黒色の状態の）ときは、隣同士とみなさない。また、並んだ直後は隣同士に並んでいるが、これは数えない。

Input

入力は以下の形式で与えられる。

W H
N
p1 p2 ... pN

1行目に列の大きさを表す整数WとHが空白区切りで与えられる。Wはコの字の横に並べる外側の人数を、Hは縦に並べる外側の人数を表す。2行目に人が一人どちらかの列からはける回数Nが与えられる。3行目には列のはけ方についての情報p1...pNが空白区切りで与えられる。piに’0’または’1’であり、’0’のとき、外側の人が一人はけることを、’1’のとき内側の人が一人はけることを表す。ただし、ウニクロ卯月さんまたは目黒凛さんが列から出ることはない。

Constraints

4 ≤ W ≤ 100

4 ≤ H ≤ 100

0 ≤ N ≤ 100

Output

二人が隣同士になる回数を一行に出力せよ。

Sample Input 1

11 11
5
0 0 0 0 0

Sample Output 1

0

Sample Input 2

11 11
5
0 0 1 1 1

Sample Output 2

1

Solution in Scala (judge verdict: Accepted)


object Main extends App {

  import scala.io.StdIn._
  import scala.math._
  val Array(w, h) = readLine.trim.split(' ').map(_.toInt)
  val n = readLine.trim.toInt
  val order = readLine.trim.split(' ').map(_.toInt == 0)
  var outside = 2 * w + h - 2
  var inside = outside - 4
  var count = 0
  for (isOutside ← order){
    if (isOutside) outside -= 1
    else inside -= 1
    if (isNeighbor(inside, outside)) count += 1
  }
  println(count)
  def isNeighbor(inside:Int, outside: Int): Boolean = {
    if (outside.isOutsideBottom && inside.isInsideBottom) outside.outsideBottomPosition == inside.insideBottomPosition
    else if (outside.isOutsideRight && inside.isInsideRight) outside.outsideRightPosition == inside.insideRightPosition
    else if (outside.isOutsideUp && inside.isInsideUp) outside.outsideUpPosition == inside.insideUpPosition
    else false
  }
  implicit class INT(val value: Int){
    def isOutsideBottom: Boolean = (1 until w).contains(value)
    def outsideBottomPosition: Int = value - 0
    def isOutsideRight: Boolean = (w + 1 to (w + h - 2)).contains(value)
    def outsideRightPosition: Int = value - w
    def isOutsideUp: Boolean = ((w + h) to (2 * w + h - 2)).contains(value)
    def outsideUpPosition: Int = value - w - h + 1
    def isInsideBottom: Boolean = (1 to w - 1).contains(value)
    def insideBottomPosition: Int = value - 0
    def isInsideRight: Boolean = (w - 1 to (w + h - 4)).contains(value)
    def insideRightPosition: Int = value - w + 2
    def isInsideUp: Boolean = (w + h - 4 to 2 * w + h - 6).contains(value)
    def insideUpPosition: Int = value - w - h + 5
  }

  implicit class Extension[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}