This commit is contained in:
kkunkka
2025-07-21 11:33:04 +08:00
parent 9a2a163f66
commit 1c76c565bf
3 changed files with 153 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
package com.dota.gridGraph._1091;
import java.util.ArrayDeque;
import java.util.LinkedList;
class Solution {
int[] next = {-1, 0, 1};
public int shortestPathBinaryMatrix(int[][] grid) {
int n = grid.length;
if (grid[0][0] == 1 || grid[n - 1][n - 1] == 1) return -1;
return bfs(grid);
}
int bfs(int[][] grid) {
var book = new boolean[grid.length][grid.length];
var queue = new ArrayDeque<int[]>();
queue.add(new int[]{0, 0});
int cnt = 0;
while (!queue.isEmpty()) {
int size = queue.size();
cnt++;
for (int ii = 0; ii < size; ii++) {
var n = queue.poll();
if (n[0] < 0 || n[1] < 0 || n[0] >= grid.length || n[1] >= grid[0].length || book[n[0]][n[1]] || grid[n[0]][n[1]] == 1)
continue;
if (n[0] == n[1] && n[0] == grid.length - 1) return cnt;
book[n[0]][n[1]] = true;
for (int i : next) {
for (int i1 : next) {
queue.offer(new int[]{n[0] + i, n[1] + i1});
}
}
}
}
return -1;
}
}

View File

@@ -0,0 +1,37 @@
package com.dota.gridGraph._1926;
import java.util.ArrayDeque;
class Solution {
public int nearestExit(char[][] maze, int[] entrance) {
int x = entrance[0];
int y = entrance[1];
var queue = new ArrayDeque<int[]>();
queue.add(new int[]{x+1, y});
queue.add(new int[]{x-1, y});
queue.add(new int[]{x, y+1});
queue.add(new int[]{x, y-1});
maze[x][y] = '+';
int cnt = 0;
while (!queue.isEmpty()) {
cnt++;
int t =queue.size();
for (int i = 0; i < t; i++) {
var n = queue.poll();
if (n[0] < 0 || n[1] < 0 || n[0] >= maze.length || n[1] >= maze[0].length || maze[n[0]][n[1]] == '+') {
continue;
}
if ((n[0]==0||n[1]==0||n[0]==maze.length-1||n[1]==maze[0].length-1)) {
return cnt;
}
maze[n[0]][n[1]] = '+';
queue.offer(new int[]{n[0] + 1, n[1]});
queue.offer(new int[]{n[0] - 1, n[1]});
queue.offer(new int[]{n[0], n[1] + 1});
queue.offer(new int[]{n[0], n[1] - 1});
}
}
return -1;
}
}

View File

@@ -0,0 +1,77 @@
package com.dota.gridGraph._lcp63;
import java.util.ArrayList;
class Solution {
public int[][] ballGame(int num, String[] plate) {
var res = new ArrayList<int[]>();
int n = plate.length;
int m = plate[0].length();
// 方向 上下左右 1,2,3,4
for (int i = 1; i < n - 1; i++) {
if (dfs(num, i, 0, plate, 4) && plate[i].charAt(0)=='.') {
res.add(new int[]{i, 0});
}
if (dfs(num, i, m - 1, plate, 3)&&plate[i].charAt(m-1)=='.') {
res.add(new int[]{i, m - 1});
}
}
for (int i = 1; i < m - 1; i++) {
if (dfs(num, 0, i, plate, 2)&&plate[0].charAt(i)=='.') {
res.add(new int[]{0, i});
}
if (dfs(num, n - 1, i, plate, 1)&&plate[n-1].charAt(i)=='.') {
res.add(new int[]{n - 1, i});
}
}
var arr = new int[res.size()][];
for (int i = 0; i < res.size(); i++) {
arr[i] = res.get(i);
}
return arr;
}
boolean dfs(int num, int i, int j, String[] plate, int to) {
if (i < 0 || j < 0 || i >= plate.length || j >= plate[0].length() || num < 0) {
return false;
}
return switch (plate[i].charAt(j)) {
case 'W' -> {
if (to == 1) {
yield dfs(num - 1, i, j - 1, plate, 3);
} else if (to == 2) {
yield dfs(num - 1, i, j + 1, plate, 4);
} else if (to == 3) {
yield dfs(num - 1, i + 1, j, plate, 2);
} else {
yield dfs(num - 1, i - 1, j, plate, 1);
}
}
case 'E' -> {
if (to == 1) {
yield dfs(num - 1, i, j + 1, plate, 4);
} else if (to == 2) {
yield dfs(num - 1, i, j - 1, plate, 3);
} else if (to == 3) {
yield dfs(num - 1, i - 1, j, plate, 1);
} else {
yield dfs(num - 1, i + 1, j, plate, 2);
}
}
case '.' -> {
if (to == 1) {
yield dfs(num - 1, i - 1, j, plate, to);
} else if (to == 2) {
yield dfs(num - 1, i + 1, j, plate, to);
} else if (to == 3) {
yield dfs(num - 1, i, j - 1, plate, to);
} else {
yield dfs(num - 1, i, j + 1, plate, to);
}
}
default -> true;
};
}
}