#Farmer, Java
The farmer only cares about his crops. He constantly watches his field for possible fires or invaders.
import java.awt.Point;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Farmer {
public static void main(String[] args) {
//row == y
//col == x
Scanner in = new Scanner(System.in);
Point start = new Point(in.nextInt(), in.nextInt());
Point current = new Point(in.nextInt(), in.nextInt());
in.nextLine();
char[][] board = new char[32][];
for (int row = 0; row < 32; row++){
board[row] = in.nextLine().toCharArray();
}
final List<Point> firesInField = new ArrayList<>();
final List<Point> enemiesInField = new ArrayList<>();
for (int row = 0; row < 32; row++) {
for (int col = 0; col < 32; col++) {
Point p = new Point(col, row);
if (!isInField(start, p))
continue;
char c = board[row][col];
if (isFire(c)) {
firesInField.add(p);
} else if (c == '@' && col != current.x && row != current.y) {
enemiesInField.add(p);
}
}
}
List<Point> destinations = firesInField.size() > 0 ? firesInField : enemiesInField;
if (destinations.size() > 0) {
//take short paths to eliminate more fires
destinations.sort(Comparator
.comparingInt((Point p) -> distance(p, current))
.thenComparingInt(p -> -1 * (board[p.y][p.x] - '0')));
Point dest = destinations.get(0);
print(moveTo(current, dest), "P", moveTo(current, dest));
}
//TODO start fires if an enemy has more intact ground
//walk back to center
print(moveTo(current, start), "P", moveTo(current, start));
}
private static void print(String move, String action, String actionMove) {
System.out.println(move + action + actionMove);
System.exit(0);
}
private static boolean isInField(Point centerOfField, Point toTest) {
//add one extra, to prevent fires that are very near
return distance(centerOfField, toTest) <= 10 && Math.abs(centerOfField.x - toTest.x) <= 5 && Math.abs(centerOfField.y - toTest.y) <= 5;
}
private static boolean isFire(char c) {
return c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6';
}
private static String moveTo(Point from, Point to) {
if (from.x > to.x){
from.x--;
return "L";
}
if (from.x < to.x){
from.x++;
return "R";
}
if (from.y > to.y){
from.y--;
return "U";
}
if (from.y < to.y){
from.y++;
return "D";
}
return "S";
}
private static int distance(Point p1, Point p2){
return Math.abs(p1.x - p2.x) + Math.abs(p2.y - p1.y);
}
}