经典笔试题:求中奖区域数及最大区域人数

求中奖区域数及最大区域人数

阿里年会抽奖,将一个会场,分成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]

posted @ 2020-07-13 11:14  gaopengpy  阅读(202)  评论(0编辑  收藏  举报