int numIslands(vector<vector<char>>& grid) {
int rows = grid.size(), cols = grid[0].size();
set<string> visited;
function<void(int, int)> dfs = [&](int r, int c) {
if (r < 0 || c < 0 || r >= rows || c >= cols) return;
string key = to_string(r) + "," + to_string(c);
if (grid[r][c] == '0' || visited.count(key)) return;
visited.insert(key);
dfs(r + 1, c);
dfs(r - 1, c);
dfs(r, c + 1);
dfs(r, c - 1);
};
int count = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '1' && !visited.count(to_string(r) + "," + to_string(c))) {
dfs(r, c);
count++;
}
}
}
return count;
}
public int numIslands(char[][] grid) {
int rows = grid.length, cols = grid[0].length;
Set<String> visited = new HashSet<>();
int count = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '1' && !visited.contains(r + "," + c)) {
dfs(grid, visited, r, c);
count++;
}
}
}
return count;
}
private void dfs(char[][] grid, Set<String> visited, int r, int c) {
if (r < 0 || c < 0 || r >= grid.length || c >= grid[0].length) return;
if (grid[r][c] == '0' || visited.contains(r + "," + c)) return;
visited.add(r + "," + c);
dfs(grid, visited, r + 1, c);
dfs(grid, visited, r - 1, c);
dfs(grid, visited, r, c + 1);
dfs(grid, visited, r, c - 1);
}
def num_islands(grid):
rows, cols = len(grid), len(grid[0])
visited = set()
def dfs(r, c):
if r < 0 or c < 0 or r >= rows or c >= cols: return
if grid[r][c] == '0' or (r, c) in visited: return
visited.add((r, c))
dfs(r + 1, c)
dfs(r - 1, c)
dfs(r, c + 1)
dfs(r, c - 1)
count = 0
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1' and (r, c) not in visited:
dfs(r, c)
count += 1
return count
function numIslands(grid: string[][]): number {
const rows = grid.length, cols = grid[0].length;
const visited = new Set<string>();
const dfs = (r: number, c: number): void => {
if (r < 0 || c < 0 || r >= rows || c >= cols) return;
if (grid[r][c] === '0' || visited.has(r + ',' + c)) return;
visited.add(r + ',' + c);
dfs(r + 1, c);
dfs(r - 1, c);
dfs(r, c + 1);
dfs(r, c - 1);
};
let count = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === '1' && !visited.has(r + ',' + c)) {
dfs(r, c);
count++;
}
}
}
return count;
}
int numIslands(vector<vector<char>>& grid) {
int rows = grid.size(), cols = grid[0].size();
vector<vector<bool>> visited(rows, vector<bool>(cols, false));
int count = 0;
int dirs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '0' || visited[r][c]) continue;
count++;
visited[r][c] = true;
queue<pair<int, int>> q; q.push({r, c});
while (!q.empty()) {
auto [cr, cc] = q.front(); q.pop();
for (auto& d : dirs) {
int nr = cr + d[0], nc = cc + d[1];
if (nr < 0 || nc < 0 || nr >= rows || nc >= cols) continue;
if (grid[nr][nc] == '0' || visited[nr][nc]) continue;
visited[nr][nc] = true;
q.push({nr, nc});
}
}
}
}
return count;
}
public int numIslands(char[][] grid) {
int rows = grid.length, cols = grid[0].length;
boolean[][] visited = new boolean[rows][cols];
int count = 0;
int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '0' || visited[r][c]) continue;
count++;
visited[r][c] = true;
Deque<int[]> queue = new ArrayDeque<>(); queue.add(new int[]{r, c});
while (!queue.isEmpty()) {
int[] cell = queue.poll(); int cr = cell[0], cc = cell[1];
for (int[] d : dirs) {
int nr = cr + d[0], nc = cc + d[1];
if (nr < 0 || nc < 0 || nr >= rows || nc >= cols) continue;
if (grid[nr][nc] == '0' || visited[nr][nc]) continue;
visited[nr][nc] = true;
queue.add(new int[]{nr, nc});
}
}
}
}
return count;
}
def num_islands(grid):
rows, cols = len(grid), len(grid[0])
visited = [[False] * cols for _ in range(rows)]
count = 0
for r in range(rows):
for c in range(cols):
if grid[r][c] == '0' or visited[r][c]: continue
count += 1
visited[r][c] = True
queue = deque([(r, c)])
while queue:
cr, cc = queue.popleft()
for dr, dc in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nr, nc = cr + dr, cc + dc
if nr < 0 or nc < 0 or nr >= rows or nc >= cols: continue
if grid[nr][nc] == '0' or visited[nr][nc]: continue
visited[nr][nc] = True
queue.append((nr, nc))
return count
function numIslands(grid: string[][]): number {
const rows = grid.length, cols = grid[0].length;
const visited = Array.from({ length: rows }, () => new Array<boolean>(cols).fill(false));
let count = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === '0' || visited[r][c]) continue;
count++;
visited[r][c] = true;
const queue: number[][] = [[r, c]];
while (queue.length > 0) {
const [cr, cc] = queue.shift()!;
for (const [dr, dc] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {
const nr = cr + dr, nc = cc + dc;
if (nr < 0 || nc < 0 || nr >= rows || nc >= cols) continue;
if (grid[nr][nc] === '0' || visited[nr][nc]) continue;
visited[nr][nc] = true;
queue.push([nr, nc]);
}
}
}
}
return count;
}
int numIslands(vector<vector<char>>& grid) {
int rows = grid.size(), cols = grid[0].size();
function<void(int, int)> sink = [&](int r, int c) {
if (r < 0 || c < 0 || r >= rows || c >= cols || grid[r][c] == '0') return;
grid[r][c] = '0';
sink(r + 1, c);
sink(r - 1, c);
sink(r, c + 1);
sink(r, c - 1);
};
int count = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '1') {
count++;
sink(r, c);
}
}
}
return count;
}
public int numIslands(char[][] grid) {
int rows = grid.length, cols = grid[0].length;
int count = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '1') {
count++;
sink(grid, r, c);
}
}
}
return count;
}
private void sink(char[][] grid, int r, int c) {
if (r < 0 || c < 0 || r >= grid.length || c >= grid[0].length || grid[r][c] == '0') return;
grid[r][c] = '0';
sink(grid, r + 1, c);
sink(grid, r - 1, c);
sink(grid, r, c + 1);
sink(grid, r, c - 1);
}
def num_islands(grid):
rows, cols = len(grid), len(grid[0])
def sink(r, c):
if r < 0 or c < 0 or r >= rows or c >= cols or grid[r][c] == '0': return
grid[r][c] = '0'
sink(r + 1, c)
sink(r - 1, c)
sink(r, c + 1)
sink(r, c - 1)
count = 0
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1':
count += 1
sink(r, c)
return count
function numIslands(grid: string[][]): number {
const rows = grid.length, cols = grid[0].length;
const sink = (r: number, c: number): void => {
if (r < 0 || c < 0 || r >= rows || c >= cols || grid[r][c] === '0') return;
grid[r][c] = '0';
sink(r + 1, c);
sink(r - 1, c);
sink(r, c + 1);
sink(r, c - 1);
};
let count = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === '1') {
count++;
sink(r, c);
}
}
}
return count;
}
int numIslands(vector<vector<char>>& grid) {
int rows = grid.size(), cols = grid[0].size();
vector<int> parent(rows * cols);
int count = 0;
for (int i = 0; i < (int)parent.size(); i++) {
parent[i] = i;
if (grid[i / cols][i % cols] == '1') count++;
}
function<int(int)> find = [&](int x) -> int {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '0') continue;
int nbs[2][2] = {{r + 1, c}, {r, c + 1}};
for (auto& nb : nbs) {
int nr = nb[0], nc = nb[1];
if (nr >= rows || nc >= cols || grid[nr][nc] == '0') continue;
int a = find(r * cols + c), b = find(nr * cols + nc);
if (a != b) {
parent[a] = b;
count--;
}
}
}
}
return count;
}
public int numIslands(char[][] grid) {
int rows = grid.length, cols = grid[0].length;
int[] parent = new int[rows * cols];
int count = 0;
for (int i = 0; i < parent.length; i++) {
parent[i] = i;
if (grid[i / cols][i % cols] == '1') count++;
}
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == '0') continue;
int[][] nbs = {{r + 1, c}, {r, c + 1}};
for (int[] nb : nbs) {
int nr = nb[0], nc = nb[1];
if (nr >= rows || nc >= cols || grid[nr][nc] == '0') continue;
int a = find(parent, r * cols + c), b = find(parent, nr * cols + nc);
if (a != b) {
parent[a] = b;
count--;
}
}
}
}
return count;
}
private int find(int[] parent, int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
def num_islands(grid):
rows, cols = len(grid), len(grid[0])
parent = list(range(rows * cols))
count = 0
for i in range(len(parent)):
if grid[i // cols][i % cols] == '1': count += 1
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]]
x = parent[x]
return x
for r in range(rows):
for c in range(cols):
if grid[r][c] == '0': continue
for nr, nc in ((r + 1, c), (r, c + 1)):
if nr >= rows or nc >= cols or grid[nr][nc] == '0': continue
a, b = find(r * cols + c), find(nr * cols + nc)
if a != b:
parent[a] = b
count -= 1
return count
function numIslands(grid: string[][]): number {
const rows = grid.length, cols = grid[0].length;
const parent = new Array<number>(rows * cols);
let count = 0;
for (let i = 0; i < parent.length; i++) {
parent[i] = i;
if (grid[Math.floor(i / cols)][i % cols] === '1') count++;
}
const find = (x: number): number => {
while (parent[x] !== x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === '0') continue;
for (const [nr, nc] of [[r + 1, c], [r, c + 1]]) {
if (nr >= rows || nc >= cols || grid[nr][nc] === '0') continue;
const a = find(r * cols + c), b = find(nr * cols + nc);
if (a !== b) {
parent[a] = b;
count--;
}
}
}
}
return count;
}