赞
踩
相似的题目:
class Solution { void dfs(vector<vector<char>>& board, int i, int j){ if(i < 0 || i >= board.size() || j < 0 || j >= board[i].size() || board[i][j] == '.') return; board[i][j] = '.'; dfs(board, i+1, j); dfs(board, i-1, j); dfs(board, i, j+1); dfs(board, i, j-1); } public: int countBattleships(vector<vector<char>>& board) { int res = 0; for (int i = 0; i < board.size(); ++i) { for (int j = 0; j < board[i].size(); ++j) { if(board[i][j] == 'X'){ ++res; dfs(board, i, j); } } } return res; } };
因为,每一艘战舰要么是竖着的,要么是横着的,而且两艘不同的战舰之间至少包含一个空格,也就是说每艘战舰的起点的上方和左方都不会是 ‘X’,所以,我们只需要统计起点即可。
class Solution { public: int countBattleships(vector<vector<char>>& board) { int m = board.size(); int n = board[0].size(); int ans = 0; // 一次扫描 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // 起点为X,左边不为X,上边不为X if (board[i][j] == 'X' && (i == 0 || board[i - 1][j] != 'X') && (j == 0 || board[i][j - 1] != 'X')) { ans++; } } } return ans; } };
class Solution { public: int countBattleships(vector<vector<char>>& board) { if (board.empty() || board[0].empty()) return 0; int res = 0, m = board.size(), n = board[0].size(); vector<vector<bool>> visited(m, vector<bool>(n, false)); vector<vector<int>> dirs{{0,-1},{-1,0},{0,1},{1,0}}; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (board[i][j] == 'X' && !visited[i][j]) { ++res; queue<pair<int, int>> q; q.push({i, j}); while (!q.empty()) { auto t = q.front(); q.pop(); visited[t.first][t.second] = true; for (auto dir : dirs) { int x = t.first + dir[0], y = t.second + dir[1]; if (x < 0 || x >= m || y < 0 || y >= n || visited[x][y] || board[x][y] == '.') continue; q.push({x, y}); } } } } } return res; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。