From 5f908c52d370e64a218efd971edb56f23bfa68b7 Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:04:40 -0700 Subject: [PATCH 1/6] Add BFS solution to calculate forest fire spread time --- src/Fire.java | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Fire.java b/src/Fire.java index b968c51..df261bd 100644 --- a/src/Fire.java +++ b/src/Fire.java @@ -1,3 +1,6 @@ +import java.util.LinkedList; +import java.util.Queue; + public class Fire { /** * Returns how long it takes for all vulnerable trees to be set on fire if a @@ -38,6 +41,49 @@ public class Fire { public static int timeToBurn(char[][] forest, int matchR, int matchC) { // HINT: when adding to your BFS queue, you can include more information than // just a location. What other information might be useful? - return -1; + + + int rows = forest.length; + int cols = forest[0].length; + + boolean[][] visited = new boolean[rows][cols]; + // BFS queue + Queue queue = new LinkedList<>(); + int[][] directions = + {{1,0},//Down + {-1,0}, //Up + {0,1}, //Right + {0,-1} //Left + }; + + // Start from the lit tree with time = 0 + queue.add(new int[]{matchR, matchC, 0}); + visited[matchR][matchC] = true; + + int maxTime = 0; + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + int r = current[0], c = current[1], time = current[2]; + maxTime = Math.max(maxTime, time); + + // Check all 4 directions + for (int[] d : directions) { + int newR = r + d[0]; + int newC = c + d[1]; + + + if (newR >= 0 && newR < rows && newC >= 0 && newC < cols && + !visited[newR][newC] && forest[newR][newC] == 't') { + + visited[newR][newC] = true; + queue.add(new int[]{newR, newC, time + 1}); + } + } + } + + return maxTime; + + } } \ No newline at end of file From dd8cf90486515cbfce841ac9c7fd72b24c947a24 Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:57:50 -0700 Subject: [PATCH 2/6] Add Single tree test --- src/FireTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/FireTest.java b/src/FireTest.java index b3b9085..b8d0420 100644 --- a/src/FireTest.java +++ b/src/FireTest.java @@ -20,4 +20,13 @@ public void testTimeToBurnExample() { assertEquals(expected, actual); } + + @Test + public void testSingleTree() { + char[][] forest = { + {'t'} + }; + assertEquals(0, Fire.timeToBurn(forest, 0, 0)); + } + } From 08f09a29e35c8c7a2d1eb9fcd2860a56d8ca7fa5 Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:59:27 -0700 Subject: [PATCH 3/6] Add tree surrounded by ground for the test --- src/FireTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/FireTest.java b/src/FireTest.java index b8d0420..985e349 100644 --- a/src/FireTest.java +++ b/src/FireTest.java @@ -28,5 +28,15 @@ public void testSingleTree() { }; assertEquals(0, Fire.timeToBurn(forest, 0, 0)); } + @Test + public void testTreeSurroundedByGround() { + char[][] forest = { + {'.','.','.'}, + {'.','t','.'}, + {'.','.','.'} + }; + assertEquals(0, Fire.timeToBurn(forest, 1, 1)); + } + } From 22a2f0dfdb6e70771e3b9d5f7e023f676e5681c7 Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:00:15 -0700 Subject: [PATCH 4/6] Add more test --- src/FireTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/FireTest.java b/src/FireTest.java index 985e349..6fb5abf 100644 --- a/src/FireTest.java +++ b/src/FireTest.java @@ -38,5 +38,14 @@ public void testTreeSurroundedByGround() { assertEquals(0, Fire.timeToBurn(forest, 1, 1)); } + @Test + public void testNoConnectedTrees() { + char[][] forest = { + {'t','.','t'}, + {'.','.','.'}, + {'t','.','t'} + }; + assertEquals(0, Fire.timeToBurn(forest, 0, 0)); + } } From 766c3e8df68f01f823798cf7ad30523eda95e17d Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:01:01 -0700 Subject: [PATCH 5/6] add Straight line of trees for the test --- src/FireTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/FireTest.java b/src/FireTest.java index 6fb5abf..1e29966 100644 --- a/src/FireTest.java +++ b/src/FireTest.java @@ -48,4 +48,12 @@ public void testNoConnectedTrees() { assertEquals(0, Fire.timeToBurn(forest, 0, 0)); } + @Test + public void testLineOfTrees() { + char[][] forest = { + {'t','t','t','t','t'} + }; + assertEquals(4, Fire.timeToBurn(forest, 0, 0)); + } + } From ab1d8d998994069d6f62698db4606f8ef4ebf0d9 Mon Sep 17 00:00:00 2001 From: elena5100 <194572363+elena5100@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:36:51 -0700 Subject: [PATCH 6/6] Add fire spread tests including edge cases --- src/FireTest.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/FireTest.java b/src/FireTest.java index 1e29966..1ba11fd 100644 --- a/src/FireTest.java +++ b/src/FireTest.java @@ -56,4 +56,49 @@ public void testLineOfTrees() { assertEquals(4, Fire.timeToBurn(forest, 0, 0)); } + + + + @Test + public void testEmptyForest() { + char[][] forest = { + {'.','.','.'}, + {'.','.','.'}, + {'.','.','.'} + }; + assertEquals(0, Fire.timeToBurn(forest, 1, 1)); + } + + @Test + public void testFullConnectedBlock() { + char[][] forest = { + {'t','t'}, + {'t','t'} + }; + assertEquals(2, Fire.timeToBurn(forest, 0, 0)); + } + + @Test + public void testCornerUnreachableTrees() { + char[][] forest = { + {'t','.','.','t'}, + {'.','.','.','.'}, + {'t','.','.','t'} + }; + assertEquals(0, Fire.timeToBurn(forest, 0, 0)); + } + + @Test + public void testVerticalColumn() { + char[][] forest = { + {'t'}, + {'t'}, + {'t'}, + {'t'} + }; + // Fire moves down each row + assertEquals(3, Fire.timeToBurn(forest, 0, 0)); + } + + }