bfs 广度优先遍历的应用 --CountHomes
2016-06-15 22:12
351 查看
题目:
为了进行城市规划,需要计算一个居住区的住宅数目。该居住聚集区俯视图已经制好,并规划为n x m个网格。如果网格单元具有屋顶定的一部分,则向其赋值1,如果是空地,则赋值0.由值为1的相邻网格单元组成的簇认定为一个单独建筑。对角放置的值为1的网格则不被视为同一住宅(屋顶)。
类Homes的方法countHomes的输入应包括一个n x m阶的二维整数数组grid,其中n和m分别表示输入数组grid的行数和列数。
该方法应该返回一个表示住宅总数目的整数,grid只包含0和1.
测试用例1:
输入:
0,0,0,0,0
0,1,1,0,0
0,0,1,1,0
0,0,0,0,0
0,0,0,0,0,
输出:
1
测试用例2:
输入:
0,0,0,0
0,1,0,0
0,0,1,0
0,0,0,0
输出:
2
代码:
为了进行城市规划,需要计算一个居住区的住宅数目。该居住聚集区俯视图已经制好,并规划为n x m个网格。如果网格单元具有屋顶定的一部分,则向其赋值1,如果是空地,则赋值0.由值为1的相邻网格单元组成的簇认定为一个单独建筑。对角放置的值为1的网格则不被视为同一住宅(屋顶)。
类Homes的方法countHomes的输入应包括一个n x m阶的二维整数数组grid,其中n和m分别表示输入数组grid的行数和列数。
该方法应该返回一个表示住宅总数目的整数,grid只包含0和1.
测试用例1:
输入:
0,0,0,0,0
0,1,1,0,0
0,0,1,1,0
0,0,0,0,0
0,0,0,0,0,
输出:
1
测试用例2:
输入:
0,0,0,0
0,1,0,0
0,0,1,0
0,0,0,0
输出:
2
代码:
import java.util.ArrayDeque; import java.util.Queue; /** * @author Administrator * */ public class Homes { public static int counthHomes(int grid[][]) { // 特殊情况处理 if (grid == null || grid[0].length == 0 || grid.length == 0) { return 0; } // 一般情况 int rows = grid.length; int cols = grid[0].length; // 访问标志数组 boolean visited[] = new boolean[rows * cols]; int home_count = 0; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { if (count_home(grid, rows, cols, row, col, visited)) { home_count++; } } } return home_count; } private static boolean count_home(int[][] grid, int rows, int cols, int row, int col, boolean[] visited) { if (row >= 0 && row < rows && col >= 0 && col < cols && visited[row * cols + col] == false && grid[row][col] == 1) { mark_neighbor_4(grid, rows, cols, row, col, visited); return true; } return false; } // 标记4连通区域,广度优先遍历 // 使用队列辅助 private static void mark_neighbor_4(int[][] grid, int rows, int cols, int row, int col, boolean[] visited) { if (row < 0 || row >= rows || col < 0 && col >= cols) { return; } Queue<Integer> indexQueue = new ArrayDeque<Integer>(); indexQueue.offer(row); indexQueue.offer(col); int curRow; int curCol; while (!indexQueue.isEmpty()) { curRow = indexQueue.poll(); curCol = indexQueue.poll(); if (curRow - 1 >= 0 && curRow < rows && curCol >= 0 && curCol < cols && grid[curRow - 1][curCol] == 1 && visited[(curRow - 1) * cols + curCol] == false) { visited[(curRow - 1) * cols + curCol] = true; indexQueue.offer(curRow - 1); indexQueue.offer(curCol); } if (curCol - 1 >= 0 && curRow >= 0 && curRow < rows && curCol < cols && grid[curRow][curCol - 1] == 1 && visited[(curRow) * cols + curCol - 1] == false) { visited[(curRow) * cols + curCol - 1] = true; indexQueue.offer(curRow); indexQueue.offer(curCol - 1); } if (curRow + 1 < rows && curRow >= 0 && curCol >= 0 && curCol < cols && grid[curRow + 1][curCol] == 1 && visited[(curRow + 1) * cols + curCol] == false) { visited[(curRow + 1) * cols + curCol] = true; indexQueue.offer(curRow + 1); indexQueue.offer(curCol); } if (curCol + 1 < cols && curRow >= 0 && curRow < rows && grid[curRow][curCol + 1] == 1 && visited[(curRow) * cols + curCol + 1] == false) { visited[(curRow) * cols + curCol + 1] = true; indexQueue.offer(curRow); indexQueue.offer(curCol + 1); } } return; } /** * @param args */ public static void main(String[] args) { int grid1[][] = new int[4][4]; System.out.println(grid1.length + "行" + grid1[0].length + "列"); for (int i = 0; i < grid1.length; i++) { for (int j = 0; j < grid1[0].length; j++) { grid1[i][j] = 1; } } System.out.println(counthHomes(grid1)); int grid2[][] = new int[4][4]; System.out.println(grid2.length + "行" + grid2[0].length + "列"); for (int i = 0; i < grid2.length; i++) { for (int j = 0; j < grid2[0].length; j++) { if (i == j) { grid2[i][j] = 1; } } } System.out.println(counthHomes(grid2)); int grid3[][] = new int[5][5]; System.out.println(grid3.length + "行" + grid3[0].length + "列"); grid3[1][1] = 1; grid3[1][2] = 1; grid3[2][2] = 1; grid3[2][3] = 1; grid3[4][3] = 1; System.out.println(counthHomes(grid3)); } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析