力扣 419. 甲板上的战舰
题目描述:
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X'表示,空位用 '.'表示。 你需要遵守以下规则:
·给你一个有效的甲板,仅由战舰或者空位组成。
·战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组·成,其中N可以是任意大小。
·两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰
解析:
同岛屿沉没问题
深度优先遍历(dfs)
Java:
public int countBattleships(char[][] board) {
int result = 0;
for(int row = 0; row < board.length; row++) {
for(int col = 0; col < board[0].length; col++) {
if(board[row][col] == 'X') {
result++;
dfs(board, row, col);
}
}
}
return result;
}
public void dfs(char[][] board,int row, int col) {
if(row < 0 || row >= board.length || col < 0 || col >= board[0].length ||
board[row][col] != 'X') {
return;
}
board[row][col] = '.';
dfs(board, row - 1, col);
dfs(board, row + 1, col);
dfs(board, row, col - 1);
dfs(board, row, col + 1);
}
JavaScript:
var countBattleships = function(board) {
let result = 0;
for(let row = 0; row < board.length; row++) {
for(let col = 0; col < board[0].length; col++) {
if(board[row][col] === "X") {
result++;
dfs(row, col);
}
}
}
function dfs(row, col) {
if(row < 0 || row >= board.length || col < 0 || col >= board[0].length ||
board[row][col] !== "X") {
return;
}
board[row][col] = ".";
dfs(row - 1, col);
dfs(row + 1, col);
dfs(row, col - 1);
dfs(row, col + 1);
}
return result;
};