题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
输入描述
第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。
输出描述
输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。
输入示例
思路
之前是统计岛屿的数量,现在是搜索每个岛屿上“1”的数量,然后取一个最大值。
C++深度优先搜索
#include <iostream>
#include <vector>
using namespace std;
int count;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {if (visited[x][y] || grid[x][y] == 0) return;visited[x][y] = true;count++;for (int i = 0; i < 4; ++i) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;dfs(grid, visited, nextx, nexty);}
}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 = vector<vector<bool>>(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) {count = 0;dfs(grid, visited, i, j);result = max(result, count);}}}cout << result << endl;
}
C++广度优先搜索
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int count;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};void bfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que;que.push({x, y});visited[x][y] = true;count++;while(!que.empty()) {pair<int, int> cur = que.front(); que.pop();int curx = cur.first;int cury = cur.second;for (int i = 0; i < 4; ++i) {for (int j = 0; j < 4; ++j) {int nextx = curx + dir[i][0];int nexty = cury + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) {count++;que.push({nextx, nexty});visited[nextx][nexty] = true;}}}}
}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 = vector<vector<bool>>(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) {count = 0;bfs(grid, visited, i, j);result = max(result, count);}}}cout << result << endl;
}
Python深度优先搜索
dir = [(0, 1), (1, 0), (0, -1), (-1, 0)]def dfs(grid, visited, x, y):global countif (visited[x][y] == True or grid[x][y] == 0): returnvisited[x][y] = Truecount += 1# print(x, y, count)for dx, dy in dir:nextx, nexty = x + dx, y + dyif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif grid[nextx][nexty] == 1 and not visited[nextx][nexty]:dfs(grid, visited, nextx, nexty)def main():n, m = map(int, input().split())grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * (m) for _ in range(n)]global countresult = 0for i in range(n):for j in range(m):if (grid[i][j] == 1 and not visited[i][j]):count = 0dfs(grid, visited, i, j)result = max(result, count)print(result)if __name__ == "__main__":main()
Python广度优先搜索
from collections import deque
dir = [(0, 1), (1, 0), (0, -1), (-1, 0)]def bfs(grid, visited, x, y):global countque = deque([(x, y)])visited[x][y] = Truecount += 1while(que):curx, cury = que.popleft()# print(curx, cury, count)for dx, dy in dir:nextx, nexty = curx + dx, cury + dyif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif grid[nextx][nexty] == 1 and not visited[nextx][nexty]:count += 1que.append((nextx, nexty))visited[nextx][nexty] = Truedef main():n, m = map(int, input().split())grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * (m) for _ in range(n)]global countresult = 0for i in range(n):for j in range(m):if (grid[i][j] == 1 and not visited[i][j]):count = 0bfs(grid, visited, i, j)result = max(result, count)print(result)if __name__ == "__main__":main()
Leetcode 695. Max Area of Island
代码
Python广度优先搜索
from collections import deque
class Solution:def bfs(self, grid, visited, x, y):dir = [(0, 1), (1, 0), (0, -1), (-1, 0)]global countque = deque([(x, y)])visited[x][y] = Truecount += 1while(que):curx, cury = que.popleft()# print(curx, cury, count)for dx, dy in dir:nextx, nexty = curx + dx, cury + dyif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif grid[nextx][nexty] == 1 and not visited[nextx][nexty]:count += 1que.append((nextx, nexty))visited[nextx][nexty] = Truedef maxAreaOfIsland(self, grid: List[List[int]]) -> int:n, m = len(grid), len(grid[0])visited = [[False] * (m) for _ in range(n)]global countresult = 0for i in range(n):for j in range(m):if (grid[i][j] == 1 and not visited[i][j]):count = 0self.bfs(grid, visited, i, j)result = max(result, count)return result
C++深度优先搜索
class Solution {
public:int count;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {if (visited[x][y] || grid[x][y] == 0) return;visited[x][y] = true;count++;for (int i = 0; i < 4; ++i) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;dfs(grid, visited, nextx, nexty);}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n = grid.size();int m = grid[0].size();vector<vector<bool>> visited = vector<vector<bool>>(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) {count = 0;dfs(grid, visited, i, j);result = max(result, count);}}}return result;}
};