- 99. 计数孤岛
熟悉dfs和bfs,注意边界条件
#include <iostream>
#include <queue>
#include <string>
#include <vector>
using namespace std;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void bfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i,
int j) {
queue<pair<int, int>> q;
q.push(make_pair(i, j));
while (!q.empty()) {
pair<int, int> pos = q.front();
q.pop();
i = pos.first;
j = pos.second;
for (auto d : dir) {
int next_i = i + d[0];
int next_j = j + d[1];
if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
next_j >= grid[0].size()) {
continue;
}
if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
visited[next_i][next_j] = true;
q.push(make_pair(next_i, next_j));
}
}
}
}
void dfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i,
int j) {
for (auto d : dir) {
int next_i = i + d[0];
int next_j = j + d[1];
if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
next_j >= grid[0].size()) {
continue;
}
if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
visited[next_i][next_j] = true;
dfs(grid, visited, next_i, next_j);
}
}
}
int main() {
int n = 0, m = 0;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>> visited(n, vector<bool>(m, false));
int result = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (!visited[i][j] && grid[i][j] == 1) {
++result;
visited[i][j] = true;
dfs(grid, visited, i, j);
}
}
}
cout << result;
return 0;
}
- [100. 最大岛屿的面积]](kamacoder.com/problempage…)
和上一道题类似,再遍历的过程中记录一下岛屿的大小即可
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i, int j,
int &maxTemp) {
for (auto d : dir) {
int next_i = i + d[0];
int next_j = j + d[1];
if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
next_j >= grid[0].size()) {
continue;
}
if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
visited[next_i][next_j] = true;
maxTemp++;
dfs(grid, visited, next_i, next_j, maxTemp);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> grid[i][j];
}
}
vector<vector<bool>> visited(n, vector<bool>(m, false));
int maxVal = 0;
int maxTemp = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (!visited[i][j] && grid[i][j] == 1) {
maxTemp = 1;
visited[i][j] = true;
dfs(grid, visited, i, j, maxTemp);
maxVal = max(maxVal, maxTemp);
}
}
}
cout << maxVal;
return 0;
}