三国势力划分问题 | 豆包MarsCode刷题

80 阅读2分钟

解题思路

  1. 数据结构选择

    • 使用一个二维数组 grid 来存储棋盘上的国家分布。
    • 使用一个二维布尔数组 visited 来标记哪些格子已经被访问过。
  2. 算法步骤

    • 遍历棋盘上的每一个格子。
    • 如果当前格子没有被访问过,并且属于某个国家,则从这个格子开始进行DFS或BFS,标记所有属于同一势力的格子。
    • 每完成一次DFS或BFS,势力数加一。

代码提示

public class Main {
    public static int solution(int n, int m, String[] s) {
        // 将字符串数组转换为二维字符数组
        char[][] grid = new char[n][m];
        for (int i = 0; i < n; i++) {
            grid[i] = s[i].toCharArray();
        }

        // 初始化visited数组
        boolean[][] visited = new boolean[n][m];

        // 初始化势力数
        int count = 0;

        // 遍历每一个格子
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 如果当前格子没有被访问过,并且属于某个国家
                if (!visited[i][j]) {
                    // 进行DFS或BFS,标记所有属于同一势力的格子
                    dfs(grid, visited, i, j);
                    // 每完成一次DFS或BFS,势力数加一
                    count++;
                }
            }
        }

        return count;
    }

    // DFS函数,用于标记所有属于同一势力的格子
    private static void dfs(char[][] grid, boolean[][] visited, int x, int y) {
        // 如果越界或者已经访问过,直接返回
        if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || visited[x][y]) {
            return;
        }

        // 标记当前格子为已访问
        visited[x][y] = true;

        // 获取当前格子的国家
        char country = grid[x][y];

        // 向四个方向进行DFS
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : directions) {
            int newX = x + dir[0];
            int newY = y + dir[1];
            // 如果新格子在范围内,并且属于同一个国家,继续DFS
            if (newX >= 0 && newX < grid.length && newY >= 0 && newY < grid[0].length && grid[newX][newY] == country) {
                dfs(grid, visited, newX, newY);
            }
        }
    }

    public static void main(String[] args) {
        System.out.println(solution(4, 4, new String[]{"1122", "1222", "3111", "3333"}) == 4);
        System.out.println(solution(2, 2, new String[]{"11", "11"}) == 1);
        System.out.println(solution(3, 3, new String[]{"123", "123", "123"}) == 3);
    }
}

关键步骤解释

  1. 数据转换:将输入的字符串数组转换为二维字符数组 grid
  2. 初始化:初始化 visited 数组,用于标记哪些格子已经被访问过。
  3. 遍历:遍历每一个格子,如果当前格子没有被访问过,并且属于某个国家,则从这个格子开始进行DFS或BFS。
  4. DFS/BFS:在DFS函数中,标记当前格子为已访问,并向四个方向进行DFS,直到所有属于同一势力的格子都被标记。

你可以根据这个框架继续完善代码,实现具体的DFS或BFS逻辑。