くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

AtCoderBeginnerContest092 D: Grid Components をScalaで解いてみた

abc092.contest.atcoder.jp

最近会社で競技プログラミング部を始めました笑
まあその辺の経緯はそのうち書くとして、上記問題を解いてみた。

初見よくわからなかったけど、最初から100 * 100のマスを定義(上半分を白、下半分を黒)として、あとはそれぞれ指定された個数分穴を開けるように作れば良い。

object GridComponents extends App {
  val sc = new java.util.Scanner(System.in)
  val A = sc.nextInt
  val B = sc.nextInt

  var a = A - 1
  var b = B - 1
  // どんなA, Bがきても、100 x 100 のマスを考える
  println("100 100")

  printLines(".", "#", b)
  printLines("#", ".", a)

  // 半分の100 x 50はmanStr
  // そこにcntの数だけ、subStrを埋める。ここで、偶数行の偶数列目だけに埋めてcntをデクリメントする
  // 偶数行の奇数列目だけを埋めることで、自陣をかならず1つのmainStrの連結成分とする
  def printLines(mainStr :String, subStr :String, c :Int) :Unit = {
    var cnt = c
    for(h <- 1 to 50) {
      if (h % 2 == 1 | cnt == 0) {
        println(mainStr * 100)
      } else {
        for(w <- 1 to 100) {
          if (w % 2 == 0 && cnt > 0) {
            print(subStr)
            cnt -= 1
          } else {
            print(mainStr)
          }
        }
        println()
      }
    }
  }
}

例えば100 100という入力がされた場合はこんな感じになる(画面に入りきらなかったので60行くらい削除したけど雰囲気は掴めるはず)
f:id:mask0702:20180407000155p:plain


そのほか同じくABC092のTravelingBudget, Chocolate, TravelingPlanも完答したものをgithubにあげて居るので興味があればどうぞ
github.com