import java.io.*; import java.util.*; public class Main { Scanner in; PrintWriter out; String FILE_NAME = "tank"; int n; int m; char[][] a;//Карта страны boolean[][][] gone;//Массив для запоминания того, обрабатывали ли мы уже это состояние int[][][] res;//Массив для хранения результатов int[][][] move;//Массив дя хранения оптимальных ходов //Процедуре на вход даётся три параметра (x,y) - клетка, где находился танк до хода и //direction - в каком направлении мы пришли // 0 соответствует ходу на север, 1 - на Запад и 2 - на Восток // она возвращает соответственно ответ для оптимального дальнейшего продолжения public int poisk(int x, int y, int direction){ // Выполнение хода if (direction==0) x++; if (direction==1) y++; if (direction==2) y--; //проверка, что ход корректный - то есть мы не вышли за пределы карты if (x<0 || x>=n || y<0 || y>=m) return -1; //Мы не можем ходить на Петины клетки if (a[x][y]=='P') return -1; //На Васиной клетке мы обязаны закончить if (a[x][y]=='V') return 0; //Если мы уже считали ответ для этой позиции, то его и надо вернуть if (gone[x][y][direction]) return res[x][y][direction]; gone[x][y][direction] = true; int best = -1;//Оптимальный ответ int bestD = -1;//Оптимальное направление движения for(char i=0;i<3;i++) if (i+direction!=3) /*Это условие означает, что мы не можем разворачиваться на 180*/{ int t = poisk(x,y,i); if (t>best){ best = t; bestD = i; } } if (best>=0 && a[x][y]=='N') best++; res[x][y][direction] = best; move[x][y][direction] = bestD; return best; } public void run() throws Exception{ Locale.setDefault(Locale.US); in = new Scanner(new File(FILE_NAME+".in")); out= new PrintWriter(new FileWriter(new File(FILE_NAME+".out"))); //Чтение входных данных m = in.nextInt(); n = in.nextInt(); a = new char[n][]; for(int i=0;i