高级农民
- 积分
- 2293
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-8-24
- 最后登录
- 1970-1-1
|
地雷那道题还挺麻烦的,想了一段时间才有头绪。直接用BFS不大方面,要同时考虑有地雷的格子和空格。我的解决办法是在BFS里用DFS, 在level order BFS里的每个level之后把用DFS得到的下一层的位置放到queue里。- public int solution2(int[][] grid, int row, int col) {
- Queue<int[]> q = new LinkedList<>();
- q.add(new int[]{row, col});
- Queue<int[]> bombsPos = new LinkedList<>();
- boolean[][] visited = new boolean[grid.length][grid[0].length];
- visited[row][col] = true;
- bombsPos.add(new int[]{row, col});
- int res = 1;
- while (!bombsPos.isEmpty()) {
- int size = bombsPos.size();
- List<int[]> tempBombPos = new LinkedList<>();
- for (int i = 0; i < size; i++) {
- int[] pos = bombsPos.remove();
- int r = pos[0];
- int c = pos[1];
- int range = grid[r][c];
- helper(tempBombPos, grid, visited, r, c, r, c, range);
- }
- res += tempBombPos.size();
- for (int[] pos : tempBombPos) {
- bombsPos.add(pos);
- }
- }
- return res;
- }
- private void helper(List<int[]> bombPos, int[][] grid, boolean[][] visited, int row, int col, int startRow, int startCol, int range) {
- for (int[] dir : DIRS) {
- int newRow = row + dir[0];
- int newCol = col + dir[1];
- if (newRow < 0 || newRow >= grid.length || newCol < 0 || newCol >= grid[0].length || visited[newRow][newCol] || (newRow - startRow) * (newRow - startRow) + (newCol - startCol) * (newCol - startCol) > range * range) continue;
- visited[newRow][newCol] = true;
- if (grid[newRow][newCol] != 0) {
- bombPos.add(new int[]{newRow, newCol});
- }
- helper(bombPos, grid, visited, newRow, newCol, startRow, startCol, range);
- }
- }
- public static void main(String[] args) {
- Bomb solution = new Bomb();
- int[][] grid = new int[][]{{1, 2, 0, 0},{0, 0, 1, 0}, {0, 2, 0, 0}, {1, 0, 0, 1}};
- System.out.println(solution.solution2(grid, 0, 0));
- }
复制代码
|
|