题目1: 99. 岛屿数量
代码:
#include <iostream>
#include <vector>
using namespace std;
static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
void dfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
for(int i = 0; i < 4; i++) {
int nx = dir[i][0] + x;
int ny = dir[i][1] + y;
if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
if(!visited[nx][ny] && graph[nx][ny] == 1) {
visited[nx][ny] = true;
dfs(graph, visited, nx, ny);
}
}
}
int main(void) {
int m, n;
cin >> m >> n;
vector<vector<int>> graph(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> graph[i][j];
}
}
vector<vector<bool>> visited(m, vector<bool>(n));
int result = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(!visited[i][j] && graph[i][j] == 1) {
visited[i][j] = true;
result++;
dfs(graph, visited, i, j);
}
}
}
cout << result << endl;
}
题目2:99. 岛屿数量
代码:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
void bfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
queue<pair<int, int>> que;
que.push({x, y});
visited[x][y] = true;
while(!que.empty()) {
auto top = que.front();
que.pop();
int cx = top.first;
int cy = top.second;
for(int i = 0; i < 4; i++) {
int nx = cx + dir[i][0];
int ny = cy + dir[i][1];
if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
if(!visited[nx][ny] && graph[nx][ny] == 1) {
que.push({nx, ny});
bfs(graph, visited, nx, ny);
}
}
}
}
int main(void) {
int m, n;
cin >> m >> n;
vector<vector<int>> graph(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> graph[i][j];
}
}
vector<vector<bool>> visited(m, vector<bool>(n));
int result = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(!visited[i][j] && graph[i][j] == 1) {
visited[i][j] = true;
result++;
bfs(graph, visited, i, j);
}
}
}
cout << result << endl;
}
题目3: 100. 岛屿的最大面积
代码:
#include <iostream>
#include <vector>
using namespace std;
static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int count = 0;
void dfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
for(int i = 0; i < 4; i++) {
int nx = dir[i][0] + x;
int ny = dir[i][1] + y;
if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
if(!visited[nx][ny] && graph[nx][ny] == 1) {
++count;
visited[nx][ny] = true;
dfs(graph, visited, nx, ny);
}
}
}
int main(void) {
int m, n;
cin >> m >> n;
vector<vector<int>> graph(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> graph[i][j];
}
}
vector<vector<bool>> visited(m, vector<bool>(n));
int result = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(!visited[i][j] && graph[i][j] == 1) {
count = 1;
visited[i][j] = true;
dfs(graph, visited, i, j);
result = max(result, count);
}
}
}
cout << result << endl;
return 0;
}