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 ...X
This is an invalid board that you will not receive - as battleships will always have a cell separating between them.
思路:
简单的思路是做搜索。但是考虑到每个船和每个船之间至少横向纵向有一个空格,那么如果只考虑每艘船的右下角:
XX.X
...X
这样的话,右下角的X右边和下面都是空格,每次碰到符合这个条件的X就认为碰到一个船,否则不管。
题解:
int countBattleships(const std::vector<std::vector<char>>& board) {
const int M = board.size();
const int N = board[0].size();
int numShips(0);
for(int i = 0; i < M; ++i) {
for(int j = 0; j < N; ++j) {
if (board[i][j] == 'X') {
numShips += ((i < M - 1 && board[i + 1][j] == '.') || (i == M - 1)) &&
((j < N - 1 && board[i][j + 1] == '.') || (j == N - 1));
}
}
}
return numShips;
}

本文介绍了一种简单有效的算法来计数二维棋盘上的战舰数量。通过搜索每艘战舰的右下角,判断其是否为独立战舰,以此实现高效计数。文章提供了完整的代码实现。

被折叠的 条评论
为什么被折叠?



