aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-02-03 16:15:47 -0500
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-02-19 13:50:55 -0500
commitb463261d5d1e70d6f0f350bc2a2507e4483d31c3 (patch)
tree36463803da9dcfa3d55c6f97bffba953d726d3b2 /src/main/java/de/hysky/skyblocker
parent2fa902328a4a4a76f5ae300db7810530183b47d2 (diff)
downloadSkyblocker-b463261d5d1e70d6f0f350bc2a2507e4483d31c3.tar.gz
Skyblocker-b463261d5d1e70d6f0f350bc2a2507e4483d31c3.tar.bz2
Skyblocker-b463261d5d1e70d6f0f350bc2a2507e4483d31c3.zip
Optimize ice fill
Diffstat (limited to 'src/main/java/de/hysky/skyblocker')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java110
1 files changed, 28 insertions, 82 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
index 166047b2..9b6e7b1f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
@@ -124,127 +124,73 @@ public class IceFill extends DungeonPuzzle {
Vector2ic start = new Vector2i(iceFillBoard.length - 1, iceFillBoard[0].length / 2);
int count = iceFillBoard.length * iceFillBoard[0].length - Arrays.stream(iceFillBoard).mapToInt(Booleans::countTrue).sum();
- List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, new ArrayList<>(List.of(start)));
+ List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, new ArrayList<>(List.of(start)), new HashSet<>(List.of(start)));
if (newPath != null) {
iceFillPath.clear();
iceFillPath.addAll(newPath);
}
}
- private List<Vector2ic> solveDfs(boolean[][] iceFillBoard, int count, List<Vector2ic> path) {
+ private List<Vector2ic> solveDfs(boolean[][] iceFillBoard, int count, List<Vector2ic> path, Set<Vector2ic> visited) {
Vector2ic pos = path.get(path.size() - 1);
- if (pos.x() == 0 && pos.y() == iceFillBoard[0].length / 2 && count == 0) {
- return path;
+ if (count == 0) {
+ if (pos.x() == 0 && pos.y() == iceFillBoard[0].length / 2) {
+ return path;
+ } else {
+ return null;
+ }
}
Vector2ic newPos = pos.add(1, 0, new Vector2i());
- if (newPos.x() < iceFillBoard.length && !iceFillBoard[newPos.x()][newPos.y()] && !path.contains(newPos)) {
+ if (newPos.x() < iceFillBoard.length && !iceFillBoard[newPos.x()][newPos.y()] && !visited.contains(newPos)) {
path.add(newPos);
- List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path);
+ visited.add(newPos);
+ List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path, visited);
if (newPath != null) {
return newPath;
- } else {
- path.remove(path.size() - 1);
}
+ path.remove(path.size() - 1);
+ visited.remove(newPos);
}
newPos = pos.add(-1, 0, new Vector2i());
- if (newPos.x() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !path.contains(newPos)) {
+ if (newPos.x() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !visited.contains(newPos)) {
path.add(newPos);
- List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path);
+ visited.add(newPos);
+ List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path, visited);
if (newPath != null) {
return newPath;
- } else {
- path.remove(path.size() - 1);
}
+ path.remove(path.size() - 1);
+ visited.remove(newPos);
}
newPos = pos.add(0, 1, new Vector2i());
- if (newPos.y() < iceFillBoard[0].length && !iceFillBoard[newPos.x()][newPos.y()] && !path.contains(newPos)) {
+ if (newPos.y() < iceFillBoard[0].length && !iceFillBoard[newPos.x()][newPos.y()] && !visited.contains(newPos)) {
path.add(newPos);
- List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path);
+ visited.add(newPos);
+ List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path, visited);
if (newPath != null) {
return newPath;
- } else {
- path.remove(path.size() - 1);
}
+ path.remove(path.size() - 1);
+ visited.remove(newPos);
}
newPos = pos.add(0, -1, new Vector2i());
- if (newPos.y() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !path.contains(newPos)) {
+ if (newPos.y() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !visited.contains(newPos)) {
path.add(newPos);
- List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path);
- if (newPath != null) {
- return newPath;
- } else {
- path.remove(path.size() - 1);
- }
- }
-
- return null;
- }
-
- /*
- void solve(boolean[][] iceFillBoard, List<Vector2ic> iceFillPath) {
- Vector2ic start = new Vector2i(iceFillBoard.length - 1, iceFillBoard[0].length / 2);
- int count = iceFillBoard.length * iceFillBoard[0].length - Arrays.stream(iceFillBoard).mapToInt(Booleans::countTrue).sum();
-
- Vector2ic[] newPath = solveDfs(iceFillBoard, count - 1, new Vector2ic[]{start});
- if (newPath != null) {
- iceFillPath.clear();
- iceFillPath.addAll(Arrays.asList(newPath));
- }
- }
-
- private Vector2ic[] solveDfs(boolean[][] iceFillBoard, int count, Vector2ic[] path) {
- Vector2ic pos = path[path.length - 1];
- if (pos.x() == 0 && pos.y() == iceFillBoard[0].length / 2 && count == 0) {
- return path;
- }
-
- Vector2ic newPos = pos.add(1, 0, new Vector2i());
- if (newPos.x() < iceFillBoard.length && !iceFillBoard[newPos.x()][newPos.y()] && !ArrayUtils.contains(path, newPos)) {
- Vector2ic[] newPath = Arrays.copyOf(path, path.length + 1);
- newPath[path.length] = newPos;
- newPath = solveDfs(iceFillBoard, count - 1, newPath);
- if (newPath != null) {
- return newPath;
- }
- }
-
- newPos = pos.add(-1, 0, new Vector2i());
- if (newPos.x() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !ArrayUtils.contains(path, newPos)) {
- Vector2ic[] newPath = Arrays.copyOf(path, path.length + 1);
- newPath[path.length] = newPos;
- newPath = solveDfs(iceFillBoard, count - 1, newPath);
- if (newPath != null) {
- return newPath;
- }
- }
-
- newPos = pos.add(0, 1, new Vector2i());
- if (newPos.y() < iceFillBoard[0].length && !iceFillBoard[newPos.x()][newPos.y()] && !ArrayUtils.contains(path, newPos)) {
- Vector2ic[] newPath = Arrays.copyOf(path, path.length + 1);
- newPath[path.length] = newPos;
- newPath = solveDfs(iceFillBoard, count - 1, newPath);
- if (newPath != null) {
- return newPath;
- }
- }
-
- newPos = pos.add(0, -1, new Vector2i());
- if (newPos.y() >= 0 && !iceFillBoard[newPos.x()][newPos.y()] && !ArrayUtils.contains(path, newPos)) {
- Vector2ic[] newPath = Arrays.copyOf(path, path.length + 1);
- newPath[path.length] = newPos;
- newPath = solveDfs(iceFillBoard, count - 1, newPath);
+ visited.add(newPos);
+ List<Vector2ic> newPath = solveDfs(iceFillBoard, count - 1, path, visited);
if (newPath != null) {
return newPath;
}
+ path.remove(path.size() - 1);
+ visited.remove(newPos);
}
return null;
}
- */
@Override
public void render(WorldRenderContext context) {