Description:
Given a 2d grid map of '1'
s (land) and '0'
s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
11110
11010
11000
00000
Answer: 1
Example 2:
11000
11000
00100
00011
Answer: 3
Solution:
很明显的BFS或者DFS,用flood fill搞定。
这里需要注意的是,新fill的点,在第一次遍历到的时候就改变颜色,grid[da][db] = '0';而不要再for k循环的外层改变,grid[a][b] = '0'; 按照前一种做法,能够避免很多重复的点入队,否则按照第二种会TLE。
import java.util.*;
public class Solution {
int m, n;
int dir[][] = new int[][] { { 1, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 } };
public int numIslands(char[][] grid) {
this.m = grid.length;
if (m == 0)
return 0;
this.n = grid[0].length;
LinkedList<Integer> mList = new LinkedList<Integer>();
LinkedList<Integer> nList = new LinkedList<Integer>();
int a, b, da, db;
int count = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
if (grid[i][j] != '1')
continue;
mList.add(i);
nList.add(j);
grid[i][j] = '0';
count++;
while (!mList.isEmpty()) {
a = mList.poll();
b = nList.poll();
for (int k = 0; k < 4; k++) {
da = a + dir[k][0];
db = b + dir[k][1];
if (valid(grid, da, db)) {
mList.add(da);
nList.add(db);
grid[da][db] = '0';
}
}
}
}
return count;
}
boolean valid(char[][] grid, int a, int b) {
if (a < 0 || a >= m)
return false;
if (b < 0 || b >= n)
return false;
if (grid[a][b] == '1')
return true;
return false;
}
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(5 & 6 & 7);
}
}