Problem:


A: 席取り - Taking a Seat -

物語

A君はある試験を受けるために試験会場の教室に入った。
ただ、A君はとても神経質なタイプだ。
そのため、状況によってA君が座りたくない席がもしかしたらあるかもしれない。
そこで、A君はある条件をもとに座れる席がいくつあるか調べることにした。

問題

A君は神経質なタイプの人間だ。
まず、A君は前から1行目の席には座れない。
というのも、試験監督の近くに座ると緊張してしまって問題が解けなくなる。
また、右隣か左隣に人がいるとA君は座れない。
テスト中に隣の鉛筆の音で集中できなくなってしまうからだ。
さらに、うるさい奴の近く (上下左右斜めの8近傍) には座れない。休憩中、声が頭に響いて休めないからだ。
あと、当たり前だがすでに生徒が座っている席は座れない。

この条件の中で果たしてA君が座れる場所があるだろうか。
教室の席はM &times; N個並んでいるとして、その個数を求めよう。

入力形式

1行目ではM (行数:縦の席数) とN (列数:横の席数) が与えられる。
2行目からM行、長さNの文字列が1行ずつ与えられる。i番目の文字列のj文字目はi行j列目の席の状態を表す。各文字は'-'、'x'、もしくは'o'のいずれかであり、空席を'-'、休憩中うるさい生徒が座る席を'x'、それ以外の生徒が座っている席を'o'とする。

制約

0<M ≤ 100

0<N ≤ 100

出力形式

条件によってA君が座れる席の個数を1行で出力せよ。最後に改行を忘れないこと。

入力例1

5 5
--o--
--xo-
--x--
o---x
--xoo

出力例1

3

入力例2

2 6
--oooo
x--o--

出力例2

1

入力例3

3 5
-----
-----
-----

出力例3

10

入力例4

4 6
o-oxoo
oo-ooo
oooxo-
o-ooox

出力例4

0


Sample input:
5 5
--o--
--xo-
--x--
o---x
--xoo


Sample output:
3

Submission status: Accepted

Solution code:

m,n = map(int,input().split())
seat = [list(input()) for i in range(m)]
dummy = ["0" for i in range(n+2)]
for i in range(m):
    seat[i].insert(0,"0")
    seat[i].append("0")
seat.insert(0,dummy)
seat.append(dummy)

for i in range(1,m + 1):
    for j in range(1,n + 1):
        if seat[i][j] == "o":
            if seat[i][j - 1] == "-":
                seat[i][j - 1] = "0"
            if seat[i][j + 1] == "-":
                seat[i][j + 1] = "0"
        elif seat[i][j] == "x":
            for k in range(3):
                for l in range(3):
                    if seat[i - 1 + k][j - 1 + l] == "-":
                        seat[i - 1 + k][j - 1 + l] = "0"

for i in range(n + 1):
    if seat[1][i] == "-":
        seat[1][i] = "0"

count = 0
for i in seat:
    for j in i:
        if j == "-":
            count += 1

print (count)

Submission status: Accepted

Solution code:
m, n = map(int, input().split())
mp = [list("#" * (n + 2))] + [list("#" + input() + "#") for _ in range(m)] + [list("#" * (n + 2))]
vec = ((1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1))
for y in range(1, m + 1):
  for x in range(1, n + 1):
    if mp[y][x] == "x":
      for dx, dy in vec:
        if mp[y + dy][x + dx] == "-":
          mp[y + dy][x + dx] = "#"
    if mp[y][x] == "o":
      if mp[y][x - 1] == "-":mp[y][x - 1] = "#"
      if mp[y][x + 1] == "-":mp[y][x + 1] = "#"
for x in range(1, n + 1):
  if mp[1][x] == "-": mp[1][x] = "#"

print(sum([line.count("-") for line in mp]))