# LeetCode 419. Battleships in a Board

## Description

Given an 2D board, count how many battleships are in it. The battleships are represented with ‘X’s, empty slots are represented with ‘.’s. You may assume the following rules:
You receive a valid board, made of only battleships or empty slots.
Battleships can only be placed horizontally or vertically. In other words, they can only be made of the shape 1xN (1 row, N columns) or Nx1 (N rows, 1 column), where N can be of any size.
At least one horizontal or vertical cell separates between two battleships – there are no adjacent battleships.
Example:

```X..X
...X
...X
```

In the above board there are 2 battleships.
Invalid Example:

```...X
XXXX
...X
```

This is an invalid board that you will not receive – as battleships will always have a cell separating between them.
Could you do it in one-pass, using only O(1) extra memory and without modifying the value of the board?

## 描述

```X..X
...X
...X
```

```...X
XXXX
...X
```

### 思路

• 横向连在一起的 “X” 构成一个战舰，竖向连在一起的 “X” 构成一个战舰。并且横向和竖向之间的战舰没有交叉。
• 对于每个战舰，统计它的第一个 “X” 。
• 如果一个 “X” 的左边或者上边有 “X”，那么它不是这个战舰的首个 “X”，忽略。只统计某一个位置是 “X”，并且其左边和上边不是 “X” 的位置数。
```# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-11-16 21:22:05

from typing import List

class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
if not board:
return 0
count, row, col = 0, len(board), len(board[0])

for i in range(row):
for j in range(col):
if board[i][j] == ".":
continue
if i > 0 and board[i - 1][j] == "X":
continue
if j > 0 and board[i][j - 1] == "X":
continue
count += 1

# 下面这种写法是正向思考，等价于上面的写法
# 思考是下面的思路，简化代码为上面的写法
# if i > 0 and j > 0:
#     if board[i][j] == "X" and board[i][j - 1] == "." and board[i - 1][j] == ".":
#         count += 1
# elif i == 0 and j == 0:
#     if board[i][j] == "X":
#         count += 1
# elif i == 0:
#     if board[i][j] == "X" and board[i][j - 1] == ".":
#         count += 1
# elif j == 0:
#     if board[i][j] == "X" and board[i - 1][j] == ".":
#         count += 1

return count
```