結果

問題 No.157 2つの空洞
コンテスト
ユーザー くわい
提出日時 2015-11-22 14:24:06
言語 Scala(Beta)
(3.8.1)
コンパイル:
scalac _filename_
実行:
java -cp .:/home/linuxbrew/.linuxbrew/Cellar/scala/3.8.1/libexec/maven2/org/scala-lang/scala3-library_3/3.8.1/scala3-library_3-3.8.1.jar:/home/linuxbrew/.linuxbrew/Cellar/scala/3.8.1/libexec/maven2/org/scala-lang/scala-library/3.8.1/scala-library-3.8.1.jar _class_
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,461 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 6,826 ms
コンパイル使用メモリ 245,652 KB
最終ジャッジ日時 2026-03-09 14:23:42
合計ジャッジ時間 7,249 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
-- [E040] Syntax Error: Main.scala:58:32 ---------------------------------------
58 |  def main(args: Array[String]) {
   |                                ^
   |                                '=' expected, but '{' found
1 error found

ソースコード

diff #
raw source code

import java.util.Scanner

import scala.collection.mutable

object Problem157 {

  type Point = (Int, Int)

  def splitField(field: Array[Array[String]]): (Seq[(Point)], Seq[(Point)]) = {
    val allSpaces: Seq[(Point)] = {
      for {
        (row, i) <- field.zipWithIndex
        (col, j) <- row.zipWithIndex
        if col == "."
      } yield {
        (i, j)
      }
    }.toSeq

    val checked = mutable.Set[(Point)]()
    val queue = mutable.Queue[(Point)]()
    checked += allSpaces.head
    queue += allSpaces.head

    while (queue.nonEmpty) {
      val space = queue.dequeue()

      for {
        dir <- Seq((-1, 0), (1, 0), (0, -1), (0, 1))
        row = space._1 + dir._1
        col = space._2 + dir._2
        if field(row)(col) == "."
        if !checked.contains(row, col)
      } {
        checked += ((row, col))
        queue += ((row, col))
      }
    }

    val room1 = checked.toSeq
    val room2 = allSpaces diff room1
    (room1, room2)
  }

  def proc(w: Int, h: Int, field: Array[Array[String]]): Int = {
    val (room1, room2) = splitField(field)

    val dists = for {
      a <- room1
      b <- room2
    } yield {
      (a._1 - b._1).abs + (a._2 - b._2).abs - 1
    }

    dists.min
  }

  def main(args: Array[String]) {
    val sc = new Scanner(System.in)
    val w = sc.nextInt()
    val h = sc.nextInt()
    val field = Array.fill(h)(sc.next().split(""))

    val result: Int = proc(w, h, field)
    println(result)
  }
}
0