Added a maximum node count to DFS.

This commit is contained in:
Harrison Deng 2020-04-22 18:40:17 -05:00
parent 39b5d0e778
commit 44c6880e07

View File

@ -9,23 +9,34 @@ import org.apache.commons.lang.NullArgumentException;
public class DepthFirstSearch { public class DepthFirstSearch {
private Queue<Node> queue; private Queue<Node> queue;
private CoordinateValidatable validatable; private CoordinateValidatable coordValidatable;
private Node startNode; private Node startNode;
private Node endNode; private Node endNode;
private HashSet<Node> checkedNodes; private HashSet<Node> checkedNodes;
private int maxNodesSearched = -1;
public DepthFirstSearch() { public DepthFirstSearch() {
checkedNodes = new HashSet<>(); checkedNodes = new HashSet<>();
queue = new PriorityQueue<>(); queue = new PriorityQueue<>();
} }
public DepthFirstSearch(int maxNodesSearched) {
this();
this.maxNodesSearched = maxNodesSearched;
}
public DepthFirstSearch(int searchRadius, CoordinateValidatable validatable) {
this(searchRadius);
setValidatable(validatable);
}
public DepthFirstSearch(CoordinateValidatable validatable) { public DepthFirstSearch(CoordinateValidatable validatable) {
this(); this();
this.validatable = validatable; setValidatable(validatable);
} }
public void setValidatable(CoordinateValidatable validatable) { public void setValidatable(CoordinateValidatable validatable) {
this.validatable = validatable; this.coordValidatable = validatable;
} }
public void setStartPosition(int x, int y) { public void setStartPosition(int x, int y) {
@ -50,7 +61,7 @@ public class DepthFirstSearch {
} }
public boolean buildPathToEndNode() { public boolean buildPathToEndNode() {
if (validatable == null) throw new IllegalStateException("Need to set a validator."); if (coordValidatable == null) throw new IllegalStateException("Need to set a validator.");
if (startNode == null) throw new IllegalStateException("Need to set the starting position."); if (startNode == null) throw new IllegalStateException("Need to set the starting position.");
queue.clear(); queue.clear();
@ -58,6 +69,7 @@ public class DepthFirstSearch {
Node begin = startNode; Node begin = startNode;
queue.add(begin); queue.add(begin);
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
if (maxNodesSearched != -1 && checkedNodes.size() >= maxNodesSearched) return false;
Node n = queue.poll(); Node n = queue.poll();
if (!n.equals(endNode)) { if (!n.equals(endNode)) {
n.child[0] = new Node(n, n.x + 1, n.y); n.child[0] = new Node(n, n.x + 1, n.y);
@ -71,7 +83,7 @@ public class DepthFirstSearch {
if (checkedNodes.add(n)) { if (checkedNodes.add(n)) {
for (int i = 0; i < n.child.length; i++) { for (int i = 0; i < n.child.length; i++) {
Node child = n.child[i]; Node child = n.child[i];
if (validatable.validate(child.x, child.y)) { if (coordValidatable.validate(child.x, child.y)) {
queue.add(child); queue.add(child);
} }
} }
@ -89,7 +101,7 @@ public class DepthFirstSearch {
* @return * @return
*/ */
public boolean findTarget(CoordinateTargetValidatable targetValidator) { public boolean findTarget(CoordinateTargetValidatable targetValidator) {
if (validatable == null) throw new IllegalStateException("Need to set a validator."); if (coordValidatable == null) throw new IllegalStateException("Need to set a validator.");
if (targetValidator == null) throw new NullArgumentException("targetValidator"); if (targetValidator == null) throw new NullArgumentException("targetValidator");
if (startNode == null) throw new IllegalStateException("Need to set the starting position."); if (startNode == null) throw new IllegalStateException("Need to set the starting position.");
@ -99,6 +111,7 @@ public class DepthFirstSearch {
queue.add(begin); queue.add(begin);
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
Node n = queue.poll(); Node n = queue.poll();
if (maxNodesSearched != -1 && checkedNodes.size() >= maxNodesSearched) return false;
if (!targetValidator.isCoordinateTarget(n.x, n.y)) { if (!targetValidator.isCoordinateTarget(n.x, n.y)) {
n.child[0] = new Node(n, n.x + 1, n.y); n.child[0] = new Node(n, n.x + 1, n.y);
n.child[1] = new Node(n, n.x - 1, n.y); n.child[1] = new Node(n, n.x - 1, n.y);
@ -111,7 +124,7 @@ public class DepthFirstSearch {
if (checkedNodes.add(n)) { if (checkedNodes.add(n)) {
for (int i = 0; i < n.child.length; i++) { for (int i = 0; i < n.child.length; i++) {
Node child = n.child[i]; Node child = n.child[i];
if (validatable.validate(child.x, child.y)) { if (coordValidatable.validate(child.x, child.y)) {
queue.add(child); queue.add(child);
} }
} }