1. 程式人生 > 實用技巧 >經典筆試題:求中獎區域數及最大區域人數

經典筆試題:求中獎區域數及最大區域人數

求中獎區域數及最大區域人數

阿里年會抽獎,將一個會場,分成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("中獎人數為"+maxAreaOfIsland(grid)); } public
static int maxAreaOfIsland(int[][] grid) { 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); } } } return 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; } }

執行結果:中獎人數為5