给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X'
表示,空位用 '.'
表示。 你需要遵守以下规则:
- 给你一个有效的甲板,仅由战舰或者空位组成。
- 战舰只能水平或者垂直放置。换句话说,战舰只能由
1xN
(1 行, N 列)组成,或者Nx1
(N 行, 1 列)组成,其中N可以是任意大小。 - 两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
示例 :
X..X
...X
...X
在上面的甲板中有2艘战舰。
无效样例 :
...X
XXXX
...X
你不会收到这样的无效甲板 - 因为战舰之间至少会有一个空位将它们分开。
进阶:
你可以用一次扫描算法,只使用O(1)额外空间,并且不修改甲板的值来解决这个问题吗?
C
void DFS(char** board,int row, int col,int m,int n)
{
if(row-1>=0 && 'X'==board[row-1][col])
{
board[row-1][col]='a';
DFS(board,row-1,col,m,n);
}
if(row+1<m && 'X'==board[row+1][col])
{
board[row+1][col]='a';
DFS(board,row+1,col,m,n);
}
if(col-1>=0 && 'X'==board[row][col-1])
{
board[row][col-1]='a';
DFS(board,row,col-1,m,n);
}
if(col+1<n && 'X'==board[row][col+1])
{
board[row][col+1]='a';
DFS(board,row,col+1,m,n);
}
}
int countBattleships(char** board, int boardRowSize, int boardColSize)
{
int m=boardRowSize;
int n=boardColSize;
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if('X'==board[i][j])
{
board[i][j]='a';
sum++;
DFS(board,i,j,m,n);
}
}
}
return sum;
}
C++ 法一
class Solution {
public:
void DFS(vector<vector<char>>& board,int row,int col)
{
if(row-1>=0 && 'X'==board[row-1][col])
{
board[row-1][col]='a';
DFS(board,row-1,col);
}
if(row+1<board.size() && 'X'==board[row+1][col])
{
board[row+1][col]='a';
DFS(board,row+1,col);
}
if(col-1>=0 && 'X'==board[row][col-1])
{
board[row][col-1]='a';
DFS(board,row,col-1);
}
if(col+1<board[0].size() && 'X'==board[row][col+1])
{
board[row][col+1]='a';
DFS(board,row,col+1);
}
}
int countBattleships(vector<vector<char>>& board)
{
int m=board.size();
int n=board[0].size();
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if('X'==board[i][j])
{
board[i][j]='a';
sum++;
DFS(board,i,j);
}
}
}
return sum;
}
};
C++法二
class Solution {
public:
int countBattleships(vector<vector<char>>& board)
{
int m=board.size();
int n=board[0].size();
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if('X'==board[i][j] && (0==i || '.'==board[i-1][j]))
{
sum++;
j++;
while('X'==board[i][j])
{
j++;
}
}
}
}
return sum;
}
};
python法一
class Solution:
def DFS(self, board, row, col):
if row-1>=0 and 'X'==board[row-1][col]:
board[row-1][col]='a'
self.DFS(board,row-1,col)
if row+1<len(board) and 'X'==board[row+1][col]:
board[row+1][col]='a'
self.DFS(board,row+1,col)
if col-1>=0 and 'X'==board[row][col-1]:
board[row][col-1]='a'
self.DFS(board,row,col-1)
if col+1<len(board[0]) and 'X'==board[row][col+1]:
board[row][col+1]='a'
self.DFS(board,row,col+1)
def countBattleships(self, board):
"""
:type board: List[List[str]]
:rtype: int
"""
m=len(board)
n=len(board[0])
res=0
for i in range(m):
for j in range(n):
if 'X'==board[i][j]:
res+=1
board[i][j]='a'
self.DFS(board,i,j)
return res
python法二
class Solution:
def countBattleships(self, board):
"""
:type board: List[List[str]]
:rtype: int
"""
m=len(board)
n=len(board[0])
res=0
for i in range(m):
for j in range(n):
if 'X'==board[i][j] and (0==i or '.'==board[i-1][j]) and (0==j or '.'==board[i][j-1]):
res+=1
return res