From 1ab32636fdd75a858b47e1de318127c1f7aa4b24 Mon Sep 17 00:00:00 2001 From: ryanrmills Date: Tue, 21 Apr 2026 14:48:46 -0700 Subject: [PATCH 1/2] first commit --- src/Location.java | 3 ++ src/Search.java | 81 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/Location.java diff --git a/src/Location.java b/src/Location.java new file mode 100644 index 0000000..77ef752 --- /dev/null +++ b/src/Location.java @@ -0,0 +1,3 @@ +public record Location(int row, int col) { + +} diff --git a/src/Search.java b/src/Search.java index cebb278..ccdc542 100644 --- a/src/Search.java +++ b/src/Search.java @@ -1,4 +1,15 @@ +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Set; + public class Search { + public static void main(String[] args){ + Location myLocation = new Location(5, 88); + System.out.println(myLocation.row()); + } /** * Finds the location of the nearest reachable cheese from the rat's position. * Returns a 2-element int array: [row, col] of the closest 'c'. If there are multiple @@ -28,7 +39,73 @@ public class Search { * @throws CrowdedMazeException if there is more than one rat in the maze * @throws HungryRatException if there is no reachable cheese */ - public static int[] nearestCheese(char[][] maze) throws EscapedRatException, CrowdedMazeException, HungryRatException { - return null; + public static Location nearestCheese(char[][] maze) throws EscapedRatException, CrowdedMazeException, HungryRatException { + Location start = ratLocation(maze); + + Queue queue = new LinkedList<>(); + + queue.add(start); + + Set visited = new HashSet<>(); + + while (!queue.isEmpty()){ + Location current = queue.poll(); + if (visited.contains(current)) continue; + if (maze[current.row()][current.col()] == 'c'){ + return current; + } + + visited.add(current); + + for (Location neighbor : neighbors(maze, current)){ + queue.add(neighbor); + } + } + + throw new HungryRatException(); + } + + public static List neighbors(char[][] maze, Location current){ + List result = new ArrayList<>(); + int[][] moves = new int[][]{ + {-1, 0}, //UP + {1, 0}, //DOWN + {0, -1}, //LEFT + {0, 1} //RIGHT + }; + + for (int[] move : moves){ + int newR = current.row() + move[0]; + int newC = current.col() + move[1]; + + if ( + newR >= 0 && newR < maze.length && + newC >= 0 && newC < maze[0].length && + maze[newR][newC] != 'w' + ){ + result.add(new Location(newR, newC)); + } + } + + return result; + } + + public static Location ratLocation(char[][] maze) throws EscapedRatException, CrowdedMazeException { + Location location = null; + for (int r = 0; r < maze.length; r++){ + for (int c = 0; c < maze[r].length; c++){ + if (maze[r][c] == 'R'){ + if (location == null) { + location = new Location(r, c); + } else { + throw new CrowdedMazeException(); + } + + } + } + } + + if (location == null) throw new EscapedRatException(); + return location; } } \ No newline at end of file From ed75fdbcc93a2679eef7cdbcb2d601bbc46d0980 Mon Sep 17 00:00:00 2001 From: ryanrmills Date: Tue, 28 Apr 2026 14:51:29 -0700 Subject: [PATCH 2/2] shortest path hashmap --- src/Search.java | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Search.java b/src/Search.java index ccdc542..2a758bd 100644 --- a/src/Search.java +++ b/src/Search.java @@ -1,14 +1,25 @@ import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.Set; public class Search { public static void main(String[] args){ - Location myLocation = new Location(5, 88); - System.out.println(myLocation.row()); + // Location myLocation = new Location(5, 88); + // System.out.println(myLocation.row()); + char[][] grid = { + {'o', 'o', 'o', 'o', 'c', 'w', 'c', 'o'}, + {'w', 'o', 'o', 'w', 'w', 'c', 'w', 'o'}, + {'o', 'o', 'o', 'o', 'R', 'w', 'o', 'o'}, + {'o', 'o', 'w', 'w', 'w', 'o', 'o', 'o'}, + {'o', 'o', 'o', 'o', 'c', 'o', 'o', 'o'} + }; + + nearestCheese(grid); } /** * Finds the location of the nearest reachable cheese from the rat's position. @@ -48,17 +59,34 @@ public static Location nearestCheese(char[][] maze) throws EscapedRatException, Set visited = new HashSet<>(); + Map prevs = new HashMap<>(); + while (!queue.isEmpty()){ Location current = queue.poll(); - if (visited.contains(current)) continue; + if (maze[current.row()][current.col()] == 'c'){ + List path = new ArrayList<>(); + + Location pointer = current; + + while (!pointer.equals(start)){ + path.add(pointer); + pointer = prevs.get(pointer); + } + + path.add(start); + + System.out.println(path.reversed()); + return current; } - visited.add(current); - for (Location neighbor : neighbors(maze, current)){ - queue.add(neighbor); + if (!visited.contains(neighbor)) { + prevs.put(neighbor, current); + queue.add(neighbor); + visited.add(neighbor); + } } }