岛屿数量
题目🔗
题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 50;
#define pi pair<int, int>
int grid[N][N];
int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };int main() {int n, m; // 行数,列数cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<int>> visited(n, vector<int>(m, 0)); // 设置访问数组int cnt = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (visited[i][j] == 0 && grid[i][j] == 1) {cnt++;queue<pi> q;q.push(pi(i, j)); visited[i][j] = 1; // 首先访问(0, 0)while (!q.empty()) {pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for (int k = 0; k < 4; k++) {int x = curx + dir[k][0];int y = cury + dir[k][1];if (x < 0 || x >= n || y < 0 || y >= m) continue; // 超出索引范围就continueif (visited[x][y] == 0 && grid[x][y] == 1) {visited[x][y] = 1;q.push(pi(x, y));}}}}}}cout << cnt << endl;return 0;
}
DFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 50;
#define pi pair<int, int>
int n, m; // 行数,列数
vector<vector<int>> grid(N, vector<int>(N, 0));
int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };void dfs(int curx, int cury, vector<vector<int>>& grid, vector<vector<int>>& visited){for(int i = 0; i < 4; i++){int x = curx + dir[i][0];int y = cury + dir[i][1];if(x < 0 || x >= n || y < 0 || y >= m) continue;if(visited[x][y] == 0 && grid[x][y] == 1){visited[x][y] = 1;dfs(x, y, grid, visited);}}
}int main() {cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<int>> visited(n, vector<int>(m, 0)); // 设置访问数组int cnt = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (visited[i][j] == 0 && grid[i][j] == 1) {visited[i][j] = 1;cnt++;dfs(i, j, grid, visited);}}}cout << cnt << endl;return 0;
}
岛屿的最大面积
题目🔗
题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m; // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向void bfs(int i, int j, vector<vector<int>>& grid, vector<vector<int>>& visited, int& cur_size){queue<pi> q;q.push(pi(i, j)); visited[i][j] = 1; // 将(i, j)入队,且设为已访问过while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue; // 如果超出索引范围则continueif(visited[x][y] == 0 && grid[x][y] == 1){q.push(pi(x, y)); // 让当前陆地入队visited[x][y] = 1;cur_size++;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> grid[i][j];}}int max_size = 0;vector<vector<int>> visited(n, vector<int>(m, 0)); // 访问数组for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){int cur_size = 0;if(visited[i][j] == 0 && grid[i][j] == 1){ // 如果当前是没有访问过的陆地才进行下面语句cur_size++; // 记录当前面积bfs(i, j, grid, visited, cur_size);max_size = max(max_size, cur_size);}}}cout << max_size << endl;return 0;
}
孤岛的总面积
题目🔗
题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。
现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。
BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m; // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向
int island_size = 0;void bfs(int i, int j, vector<vector<int>>& grid){queue<pi> q;q.push(pi(i, j)); grid[i][j] = 0; // 将(i, j)入队,且设为已访问过island_size++;while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue; // 如果超出索引范围则continueif(grid[x][y] == 1){q.push(pi(x, y)); // 让当前陆地入队grid[x][y] = 0;island_size++;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> grid[i][j];}}for(int i = 0; i < n; i++){ // 从左边和右边向中间遍历if(grid[i][0] == 1) bfs(i, 0, grid);if(grid[i][m-1] == 1) bfs(i, m-1, grid);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(0, j, grid);if(grid[n-1][j] == 1) bfs(n-1, j, grid);}island_size = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 1){ // 如果当前是没有访问过的陆地才进行下面语句bfs(i, j, grid);}}}cout << island_size << endl;return 0;
}
沉没孤岛
题目🔗
题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。
现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。
BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m; // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向
int island_size = 0;void bfs(int i, int j, vector<vector<int>>& grid, int flag){queue<pi> q;q.push(pi(i, j)); grid[i][j] = flag; // 将(i, j)入队,且设为已访问过while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue; // 如果超出索引范围则continueif(grid[x][y] == 1){q.push(pi(x, y)); // 让当前陆地入队grid[x][y] = flag;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> grid[i][j];}}int flag = 2; // 标记周边岛屿为2for(int i = 0; i < n; i++){ // 从左边和右边向中间遍历if(grid[i][0] == 1) bfs(i, 0, grid, flag);if(grid[i][m-1] == 1) bfs(i, m-1, grid, flag);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(0, j, grid, flag);if(grid[n-1][j] == 1) bfs(n-1, j, grid, flag);}flag = 0; // 标记孤岛为0for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 1){ // 如果当前是没有访问过的陆地才进行下面语句bfs(i, j, grid, flag);}}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 2) grid[i][j] = 1;if(j != 0) cout << " " << grid[i][j];else cout << grid[i][j];}cout << endl;}return 0;
}