LeetCode之岛屿的数量

来源:互联网 发布:贵州大数据登录 编辑:程序博客网 时间:2024/04/30 07:49
package 岛屿数量;import java.util.Scanner;/** * 题目:给定的一个二维网格的地图(’1’(陆地)和0(水)),计数岛的数量。岛屿是四面环水,是由相邻的陆地水平或垂直连接而形成的。 * 你可以假设该网格的所有四个边都被水包围。 采用深度优先遍历,把访问过的改为‘0’,继续遍历 *  * @author WangSai * */public class IsLandNum {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 获取键盘输入的第一行 n 和m 值String str = sc.nextLine();String[] mystr = str.split(" ");// 行int n = 0;// 列int m = 0;// 若存在多个空格,使用split(" "),会出现空字符串现象。下面这么做是为了避免这种情况for (int i = 0; i < mystr.length; i++) {if (mystr[i] != "" && n == 0)n = Integer.parseInt(mystr[i]);else if (mystr[i] != "" && n != 0)m = Integer.parseInt(mystr[i]);}// 创建二维数组n行m列,存放矩阵char[][] input = new char[n][m];int row = 0;// 把m行n列矩阵读取到二维数组里面while (sc.hasNextLine()) {String instr = sc.nextLine();input[row] = instr.toCharArray();row++;if (row == n)break;}int num = numIslands(input);System.out.print(num);}// 处理二维数组public static int numIslands(char[][] matrix) {// 异常值检测if (matrix == null || matrix.length == 0 || matrix[0].length == 0)return 0;// 获取矩阵的行列数量int rows = matrix.length;int cols = matrix[0].length;int count = 0;// 遍历矩阵的每一个点for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++)// 注意charif (matrix[i][j] == '1') {count++;dfsSearch(matrix, i, j, rows, cols);}}return count;}// 每遇到'1'后, 开始向四个方向 递归搜索. 搜到后变为'0',// 因为相邻的属于一个island. 然后开始继续找下一个'1'.private static void dfsSearch(char[][] matrix, int rowNum, int colNum, int rows, int cols) {if (rowNum < 0 || rowNum >= rows || colNum < 0 || colNum >= cols)return;if (matrix[rowNum][colNum] != '1')return;matrix[rowNum][colNum] = '0';dfsSearch(matrix, rowNum + 1, colNum, rows, cols);dfsSearch(matrix, rowNum - 1, colNum, rows, cols);dfsSearch(matrix, rowNum, colNum + 1, rows, cols);dfsSearch(matrix, rowNum, colNum - 1, rows, cols);}}

0 0