裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

縦線と横線でマス目を塗る

2017年03月22日 | ブログラミング

縦線と横線でマス目を塗る

締め切りが 2017/03/22 10:00 AM なので,その 1 分後に投稿されるように予約

【概要】

マス目をルールに従って黒く塗っていきます。
黒く塗られたマス目の数を数えてください。

【詳細】

マス目を塗る方法は、以下の二通りあります(以下、座標系はyが大きい方が上、xが大きい方が右です):
方向を表す記号     状況
V     下から上に塗る(y座標が大きい方向に塗りすすめる)
H     左から右に塗る(x座標が大きい方向に塗りすすめる)

【入出力】

入力は
H,1,2,8 V,4,1,8 H,1,7,5 V,7,7,2
のようになっています。

塗り方が、空白区切りで並んでいます。
塗り方は、「方向を表す記号」「塗りはじめのマスのx座標」「塗りはじめのマスのy座標」「マスの数」が、コンマ区切りで並んでいます。

出力は、
21
のような感じです。
塗られている面積を10進数で普通に出力してください。

【例】
入力                出力
H,1,2,8 V,4,1,8 H,1,7,5 V,7,7,2     21     



V,3,9,4 H,0,4,13 H,4,10,2 V,8,2,11     29     



V,8,7,2 H,8,10,6 V,9,9,7 H,10,14,4 H,11,0,3     21     



【補足】

    不正な入力に対処する必要はありません。
    x座標・y座標 は、いずれも 0以上 一千万 以下の整数です。
    長さ は、1以上 一千万 以下の整数です。
    「塗り方」の個数は 十 個を超えることはありません。

=========================

f = function(s) {
    s = matrix(unlist(strsplit(s, "[, ]")), 4)
    x = as.integer(s[2, ])
    y = as.integer(s[3, ])
    n = as.integer(s[4, ])
    t = s[1, ]
    L = length(t)
    for (i in 1:(L - 1)) {
        for (j in (i + 1):L) {
            if (t[i] == "H" && t[j] == "H") {
                if (y[i] == y[j] && (x[j] >= x[i] || x[i] >= x[j] || (x[i] >= x[j] && x[j]+n[j] >= x[i]+n[i]))) {
                    x[i] = min(x[i], x[j])
                    n[i] = max(x[i]+n[i], x[j]+n[j])-x[i]
                    n[j] = 0
                    t[j] = ""
                }
            } else if (t[i] == "V" && t[j] == "V") {
                if (x[i] == x[j] && (y[j] >= y[i] || y[i] >= y[j] || (y[i] >= y[j] && y[j]+n[j] >= y[i]+n[i]))) {
                    y[i] = min(y[i], y[j])
                    n[i] = max(y[i]+n[i], y[j]+n[j])-y[i]
                    n[j] = 0
                    t[j] = ""
                }
            }
        }
    }
    count = sum(n)
    for (i in 1:(L - 1)) {
        for (j in (i + 1):L) {
            if (t[i] == "H" && t[j] == "V") {
                count = count - (x[j] >= x[i] && x[i] + n[i]-1 >= x[j] && y[i] >= y[j] &&  y[j] + n[j]-1 >= y[i])
            } else if (t[i] == "V" && t[j] == "H") {
                count = count - (x[i] >= x[j] && x[j] + n[j]-1 >= x[i] && y[j] >= y[i] && y[i] + n[i]-1 >= y[j])
            }
        }
    }
    cat(count)
}
f(readLines(file("stdin", "r")))



コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村