0.算法
![](https://img-blog.csdnimg.cn/direct/3bbbb13f3a274d2abfab430695caf514.png)
1.迷宫中离⼊⼝最近的出⼝
. - 力扣(LeetCode)
![](https://img-blog.csdnimg.cn/direct/cd3462cffee44980837e71c4c63528e9.png)
class Solution {
int[] dx = { 0, 0, -1, 1 };
int[] dy = { 1, -1, 0, 0 };
public int nearestExit(char[][] maze, int[] e) {
int m = maze.length, n = maze[0].length;
boolean[][] vis = new boolean[m][n];
Queue<int[]> q = new LinkedList<>();
q.add(new int[] { e[0], e[1] });
vis[e[0]][e[1]] = true;
int step = 0;
while (!q.isEmpty()) {
step++;
int sz = q.size();
for (int i = 0; i < sz; i++) {
int[] t = q.poll();
int a = t[0], b = t[1];
for (int j = 0; j < 4; j++) {
int x = a + dx[j], y = b + dy[j];
if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' && !vis[x][y]) {
// 判断是否已经到出⼝
if (x == 0 || x == m - 1 || y == 0 || y == n - 1)
return step;
vis[x][y] = true;
q.add(new int[] { x, y });
}
}
}
}
return -1;
}
}
2.最小基因变化
433. 最小基因变化 - 力扣(LeetCode)
![](https://img-blog.csdnimg.cn/direct/a5403664e4ac45949f5546bb1f846be3.png)
![](https://img-blog.csdnimg.cn/direct/9ae1a25b7f874d9b9197b92fff5c2054.png)
class Solution {
public int minMutation(String startGene, String endGene, String[] bank) {
Set<String> vis = new HashSet<>(); // ⽤来标记已经搜索过的状态
Set<String> hash = new HashSet<>(); // ⽤来统计基因库⾥⾯的字符串
for (String s : bank)
hash.add(s);
char[] change = { 'A', 'C', 'G', 'T' };
if (startGene.equals(endGene))
return 0;
if (!hash.contains(endGene))
return -1;
Queue<String> q = new LinkedList<>();
q.add(startGene);
vis.add(startGene);
int step = 0;
while (!q.isEmpty()) {
step++;
int sz = q.size();
while (sz-- != 0) {
String t = q.poll();
for (int i = 0; i < 8; i++) {
char[] tmp = t.toCharArray();
for (int j = 0; j < 4; j++) {
tmp[i] = change[j];
String next = new String(tmp);
if (hash.contains(next) && !vis.contains(next)) {
if (next.equals(endGene))
return step;
q.add(next);
vis.add(next);
}
}
}
}
}
return -1;
}
}
3.单词接龙
127. 单词接龙 - 力扣(LeetCode)
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Set<String> hash = new HashSet<>();
for (String s : wordList)
hash.add(s);
Set<String> vis = new HashSet<>(); // 标记已经搜索过的单词
if (!hash.contains(endWord))
return 0;
Queue<String> q = new LinkedList<>();
q.add(beginWord);
vis.add(beginWord);
int ret = 1;
while (!q.isEmpty()) {
ret++;
int sz = q.size();
while (sz-- != 0) {
String t = q.poll();
for (int i = 0; i < t.length(); i++) {
char[] tmp = t.toCharArray();
for (char ch = 'a'; ch <= 'z'; ch++) {
tmp[i] = ch;
String next = new String(tmp);
if (hash.contains(next) && !vis.contains(next)) {
if (next.equals(endWord))
return ret;
q.add(next);
vis.add(next);
}
}
}
}
}
return 0;
}
}
![](https://img-blog.csdnimg.cn/direct/4127d12aa3b745b6a23e026cc968b037.png)
4.为高尔夫比赛砍树
675. 为高尔夫比赛砍树 - 力扣(LeetCode)
![](https://img-blog.csdnimg.cn/direct/2f7a9937bd8246faa19e7efd952e0695.png)
class Solution {
int m, n;
public int cutOffTree(List<List<Integer>> f) {
m = f.size();
n = f.get(0).size();
List<int[]> trees = new ArrayList<>();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (f.get(i).get(j) > 1)
trees.add(new int[] { i, j });
Collections.sort(trees, (a, b) -> {
return f.get(a[0]).get(a[1]) - f.get(b[0]).get(b[1]);
});
int bx = 0, by = 0;
int ret = 0;
for (int[] next : trees) {
int a = next[0], b = next[1];
int step = bfs(f, bx, by, a, b);
if (step == -1)
return -1;
ret += step;
bx = a;
by = b;
}
return ret;
}
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
public int bfs(List<List<Integer>> f, int bx, int by, int ex, int ey) {
if (bx == ex && by == ey)
return 0;
Queue<int[]> q = new LinkedList<>();
boolean[][] vis = new boolean[m][n];
q.add(new int[] { bx, by });
vis[bx][by] = true;
int step = 0;
while (!q.isEmpty()) {
int sz = q.size();
step++;
while (sz-- != 0) {
int[] t = q.poll();
int a = t[0], b = t[1];
for (int i = 0; i < 4; i++) {
int x = a + dx[i], y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && f.get(x).get(y) != 0 && !vis[x][y]) {
if (x == ex && y == ey)
return step;
q.add(new int[] { x, y });
vis[x][y] = true;
}
}
}
}
return -1;
}
}