解题思路
-
数据结构选择:
- 使用一个二维数组
grid来存储棋盘上的国家分布。 - 使用一个二维布尔数组
visited来标记哪些格子已经被访问过。
- 使用一个二维数组
-
算法步骤:
- 遍历棋盘上的每一个格子。
- 如果当前格子没有被访问过,并且属于某个国家,则从这个格子开始进行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);
}
}
关键步骤解释
- 数据转换:将输入的字符串数组转换为二维字符数组
grid。 - 初始化:初始化
visited数组,用于标记哪些格子已经被访问过。 - 遍历:遍历每一个格子,如果当前格子没有被访问过,并且属于某个国家,则从这个格子开始进行DFS或BFS。
- DFS/BFS:在DFS函数中,标记当前格子为已访问,并向四个方向进行DFS,直到所有属于同一势力的格子都被标记。
你可以根据这个框架继续完善代码,实现具体的DFS或BFS逻辑。