縦線と横線でマス目を塗る
締め切りが 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")))