class Solution {
const static int dir[][2];
public:
void markstart(vector<vector<char> >&grid, int r, int c) {
int n = grid.size(), m = grid[0].size();
queue<int> q;
q.push(r * m + c);
grid[r][c] = '2';
while (!q.empty()) {
r = q.front() / m;
c = q.front() % m;
q.pop();
for (int i = 0; i < 4; ++i) {
int nr = dir[i][0] + r;
int nc = dir[i][1] + c;
if (nr >= 0 && nr < n && nc >= 0 && nc < m) {
if (grid[nr][nc] == '1') {
q.push(nr * m + nc);
grid[nr][nc] = '2';
}
}
}
}
}
int numIslands(vector<vector<char>> &grid) {
int n = grid.size();
if (n == 0) return 0;
int m = grid[0].size();
if (m == 0) return 0;
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == '1') {
++ans;
markstart(grid, i, j);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
grid[i][j] = grid[i][j] == '2' ? '1':grid[i][j];
}
}
return ans;
}
};
const int Solution::dir[][2] = {{-1,0}, {1,0}, {0,1}, {0,-1}};