题目描述:
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
...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.
Follow up:
Could you do it in one-pass, using only O(1) extra memory and without modifying the value of the board?
在矩阵中,用相连的“X”表示一艘战舰,每艘战舰必定不和其他战舰相交,求甲板上一共有多少艘战舰,要求只遍历一遍,使用O(1)的额外空间。其实只需要判断一艘战舰的首部就能确定一艘战舰,当一个点为“X”,而且它的上方或者前方都不是“X”,或者它位于第一列或者第一行,都说明这个点是战舰首部,因此战舰数加一。
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
if(board.size()==0||board[0].size()==0) return 0;
int m=board.size();
int n=board[0].size();
int count=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(board[i][j]=='X'&&(i==0||board[i-1][j]=='.')&&(j==0||board[i][j-1]=='.'))
count++;
}
}
return count;
}
};