pathfinder/src/main/java/assessment/algorithm/Grid.java
2024-11-09 22:56:24 +01:00

59 lines
1.9 KiB
Java

package assessment.algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* Represents a square grid. Integer values at position x,y
*/
public record Grid(List<List<Integer>> grid) {
private static final double timeValueFactor = .2;
public static Grid fromFile(String resource) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(Grid.class.getClassLoader().getResourceAsStream(resource)));
String line;
List<List<Integer>> rows = new ArrayList<>();
while ((line = reader.readLine()) != null) {
String[] values = line.split(" ");
List<Integer> row = new ArrayList<>(values.length);
for (int i = 0; i < values.length; i++) {
row.add(Integer.parseInt(values[i]));
}
rows.add(row);
}
return new Grid(rows);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public int getInitialValue(int x, int y) {
return grid.get(y).get(x);
}
//assumes square
public int getWidth() {
return grid.size();
}
/**
* The value of a point is the initialValue unless it has been visited (in a path)
* Immediately after visiting its value is 0 and in steady pace (timeValueFactor) increases with time.
*/
public double getCurrentValue(Path path, int x, int y) {
int gridValue = getInitialValue(x, y);
if (path.hasPoint(this, x, y)) {
// been there
int distanceInPath = path.getDistanceInPath(x, y) - 1;
double increment = gridValue * timeValueFactor;
return Math.min((distanceInPath - 1) * increment, gridValue);
} else {
return gridValue;
}
}
}