From 647d95cd3cc593b9cf7742416c356615954d82ca Mon Sep 17 00:00:00 2001
From: "couetoux.b" <bidule>
Date: Fri, 25 Oct 2024 11:13:07 +0200
Subject: [PATCH] extract closest neighbour

---
 gradle/wrapper/gradle-wrapper.properties  |  2 +-
 src/main/java/model/FirefighterBoard.java | 29 +++++------------
 src/main/java/model/TargetStrategy.java   | 38 +++++++++++++++++++++++
 3 files changed, 46 insertions(+), 23 deletions(-)
 create mode 100644 src/main/java/model/TargetStrategy.java

diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index e411586..1e2fbf0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 97abb90..1d4ca4c 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -10,6 +10,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int rowCount;
   private final int initialFireCount;
   private final int initialFirefighterCount;
+  private final TargetStrategy targetStrategy = new TargetStrategy(this);
   private List<Position> firefighterPositions;
   private Set<Position> firePositions;
   private int step = 0;
@@ -87,7 +88,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     List<Position> modifiedPosition = new ArrayList<>();
     List<Position> firefighterNewPositions = new ArrayList<>();
     for (Position firefighterPosition : firefighterPositions) {
-      Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
+      Position newFirefighterPosition =
+              targetStrategy.neighborClosestToFire(firefighterPosition, firePositions);
       firefighterNewPositions.add(newFirefighterPosition);
       extinguish(newFirefighterPosition);
       modifiedPosition.add(firefighterPosition);
@@ -112,7 +114,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     firePositions.remove(position);
   }
 
-  private List<Position> neighbors(Position position) {
+  public List<Position> neighbors(Position position) {
     List<Position> list = new ArrayList<>();
     if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
     if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
@@ -121,26 +123,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return list;
   }
 
-  private Position neighborClosestToFire(Position position) {
-    Set<Position> seen = new HashSet<>();
-    HashMap<Position, Position> firstMove = new HashMap<>();
-    Queue<Position> toVisit = new LinkedList<>(neighbors(position));
-    for (Position initialMove : toVisit)
-      firstMove.put(initialMove, initialMove);
-    while (!toVisit.isEmpty()) {
-      Position current = toVisit.poll();
-      if (firePositions.contains(current))
-        return firstMove.get(current);
-      for (Position adjacent : neighbors(current)) {
-        if (seen.contains(adjacent)) continue;
-        toVisit.add(adjacent);
-        seen.add(adjacent);
-        firstMove.put(adjacent, firstMove.get(current));
-      }
-    }
-    return position;
-  }
-
   @Override
   public void setState(List<ModelElement> state, Position position) {
     firePositions.remove(position);
@@ -154,4 +136,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
       }
     }
   }
+
+  public List<Position> getFirePositions() {
+return firefighterPositions;  }
 }
\ No newline at end of file
diff --git a/src/main/java/model/TargetStrategy.java b/src/main/java/model/TargetStrategy.java
new file mode 100644
index 0000000..2367ebe
--- /dev/null
+++ b/src/main/java/model/TargetStrategy.java
@@ -0,0 +1,38 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+public class TargetStrategy {
+    private final FirefighterBoard firefighterBoard;
+
+    public TargetStrategy(FirefighterBoard firefighterBoard) {
+        this.firefighterBoard = firefighterBoard;
+    }
+
+    /**
+     * @param position current position.
+     * @param targets positions that are targeted.
+     * @return the position next to the current position that is on the path to the closest target.
+     */
+    Position neighborClosestToFire(Position position, Collection<Position> targets) {
+        Set<Position> seen = new HashSet<Position>();
+        HashMap<Position, Position> firstMove = new HashMap<Position, Position>();
+        Queue<Position> toVisit = new LinkedList<Position>(firefighterBoard.neighbors(position));
+        for (Position initialMove : toVisit)
+            firstMove.put(initialMove, initialMove);
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            if (targets.contains(current))
+                return firstMove.get(current);
+            for (Position adjacent : firefighterBoard.neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
+        return position;
+    }
+}
\ No newline at end of file
-- 
GitLab