https://blog.csdn.net/u010150046/article/details/72934668
【题目】
一个矩阵中只有0和1两种值, 每个位置都可以和自己的上、 下、 左、 右
四个位置相连, 如果有一片1连在一起, 这个部分叫做一个岛, 求一个
矩阵中有多少个岛?
举例:
0 0 1 0 1 0
1 1 1 0 1 0
1 0 0 1 0 0
0 0 0 0 0 0
这个矩阵中有三个岛。
【思想】
运用了一些递归的思想,首先是双层for循环逐个遍历矩阵的元素.
找到某个元素为1的时候,利用递归的思想将这个元素的上下左右,和它相邻的为1的上下左右元素,和相邻的相邻的…. 这些元素改为0
最后返回num
【代码】
//岛的个数
public static int countIsland(int[][] arr){
if(arr==null||arr.length==0||arr[0].length==0){
return 0;
}
int res=0;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++){
if(arr[i][j]==1){
//coverIsland(arr,i,j);
change(arr,i,j);
res++;
}
}
}
return res;
}
//报错,数组边界溢出?
private static void coverIsland(int[][] arr, int i, int j) {
if(arr[i][j]==0 || i<0 || j<0 || i>=arr.length
||j>=arr[0].length) return;
else{
arr[i][j]=0;
coverIsland(arr,i+1,j);
coverIsland(arr,i,j+1);
coverIsland(arr,i-1,j);
coverIsland(arr,i,j-1);
}
}
public static int[][] change(int[][] grid, int i, int j) {
// 修改为0
grid[i][j] = 0;
if (i > 0 && grid[i - 1][j] == 1) {
// 修改左边的
grid = change(grid, i - 1, j);
}
if (j < grid[i].length - 1 && grid[i][j + 1] == 1) {
// 修改右边的
grid = change(grid, i, j + 1);
}
if (j > 0 && grid[i][j - 1] == 1) {
// 修改上边的
grid = change(grid, i, j - 1);
}
if (i < grid.length - 1 && grid[i + 1][j] == 1) {
// 修改下边的
grid = change(grid, i + 1, j);
}
return grid;
}