Problem:
A: 席取り - Taking a Seat -

物語

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

問題

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

この条件の中で果たしてA君が座れる場所があるだろうか。
教室の席はM × 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

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Scanner;

/**
 * Taking a Seat
 */
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String line;

		int M, N;
		M = sc.nextInt();
		N = sc.nextInt();

		boolean[][] seats = new boolean[M + 2][N + 2];

		for (int i = 0; i < M + 2; i++) {
			Arrays.fill(seats[i], true);
		}

		//
		Arrays.fill(seats[1], false);

		for (int i = 1; i <= M; i++) {
			String s = sc.next();
			for (int j = 1; j <= N; j++) {
				char c = s.charAt(j - 1);
				if (c == 'o') {
					for (int k = -1; k <= 1; k++) {
						seats[i][j + k] = false;
					}
				} else if (c == 'x') {
					for (int k = -1; k <= 1; k++) {
						for (int l = -1; l <= 1; l++) {
							seats[i + k][j + l] = false;
						}
					}
				}
			}
		}

		int ans = 0;

		for (int i = 1; i <= M; i++) {
			for (int j = 1; j <= N; j++) {
				if (seats[i][j]) ans++;
			}
		}

		System.out.println(ans);
	}
}