经典笔试题:求中奖区域数及最大区域人数
求中奖区域数及最大区域人数
阿里年会抽奖,将一个会场,分成X行Y列,若某一个同学中奖则用 1 表示,未中奖则用 0 表示,
任给一个这样的座位布局,
(中奖区域划分规则:如果两个座位之间能够在不穿越其他座位的情况下连成直线,则1 1属于同一中奖区域,
比如下图 1 是可以连起来的一个中奖区域,中奖人数是4:
0 1 0
0 0 1
0 1 0
0 1 0
)
计算下图中奖的座位区域数和最大中奖区域人数?
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 1 0 0
1 0 0 1 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 1
0 1 0 1 0 0 0 1 0 0
0 0 0 0 1 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1
0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
解题思路:
1、DFS(深度优先搜索算法)
2、将探测到的中奖位置置0
public class Test { public static void main(String[] args) { int[][] grid = {{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 }, { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; System.out.println("中奖区域数及最大区域人数分别是" +
Arrays.toString(maxAreaOfIsland(grid))); } public static int[] maxAreaOfIsland(int[][] grid) { int areaCount = 0; int result = 0; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { if (grid[i][j] == 1) { int count = dfs(i, j, grid); result = Math.max(result, count); areaCount ++; } } } return new int[]{areaCount,result}; } public static int dfs(int row, int col, int[][] grid) { if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == 0) { return 0; } //中奖区域沉没 grid[row][col] = 0; int count = 1; // 横竖探测 count += dfs(row - 1, col, grid); count += dfs(row + 1, col, grid); count += dfs(row, col - 1, grid); count += dfs(row, col + 1, grid); //对角线探测 count += dfs(row - 1, col - 1, grid); // 左上对角 count += dfs(row - 1, col + 1, grid); // 左下对角 count += dfs(row + 1, col - 1, grid); // 右上对角 count += dfs(row + 1, col + 1, grid); // 右下对角 return count; } }
运行结果:中奖区域数及最大区域人数分别是[8, 5]