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) orNx1(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 ...XIn the above board there are 2 battleships.
Invalid Example:
...X XXXX ...XThis is an invalid board that you will not receive - as battleships will always have a cell separating between them.
Follow up:
Could you do it in one-pass, using only O(1) extra memory and without modifying the value of the board?
Solution:
public:
int countBattleships(vector<vector<char>>& board) {
int ans = 0;
int rows = board.size();
if (rows == 0) {
return 0;
}
int cols = board[0].size();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 'X') {
ans++;
if (check_right(board, i, j+1)) {
continue;
}
if (check_bottom(board, i+1, j)) {
continue;
}
}
}
}
return ans;
}
bool check_right(vector<vector<char>>& board, int i, int j) {
if (j == board[0].size()) {
return false;
}
bool flag = false;
while (j < board[0].size() && board[i][j] == 'X') {
board[i][j] = '.';
j++;
flag = true;
}
return flag;
}
bool check_bottom(vector<vector<char>>& board, int i, int j) {
if (i == board.size()) {
return false;
}
bool flag = false;
while (i < board.size() && board[i][j] == 'X') {
board[i][j] = '.';
i++;
flag = true;
}
return flag;
}
};
int countBattleships(vector<vector<char>>& board) { if (board.empty() || board[0].empty()) return 0; int res = 0, m = board.size(), n = board[0].size(); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (board[i][j] == '.' || (i > 0 && board[i - 1][j] == 'X') || (j > 0 && board[i][j - 1] == 'X')) continue; ++res; } } return res; }
