Java, динамическое программирование
Начал изучать динамическое программирование. Что-то ответ не нравится) Помогите найти ошибку!?
Условие: надо написать функцию, которая принимала бы параметрами поле в виде двумерного массива, две координаты клетки, в которой находится H, и которая выводила бы на экран поле с маршрутом для D из левого верхнего угла до H. Если такого маршрута нет, программа должна сообщить об этом. Программа должна работать за время и дополнительную память не хуже чем O(n2).
Ответ получается не правильный, есть квадратное поле клеток n на n, объект(dog) может перемещаться только на клетку вправо или на клетку вниз, причём он не может перемещаться в клетку, в которой находится "*" Координаты считаются так: слева сверху x = 0, y = 0, координата x растёт вправо, координата y растёт вниз, т.е. левый нижний угол имеет координаты (0; n-1), правый нижний (n-1; n-1), правый верхний (n-1; 0)
import java.util.Random;
public class Main {
public static int SIZE = 10;
public static char DOG = 'D';
public static char CACTUS = '*';
public static char E = '-';
public static char H = 'H';
public static String find_path(char[][] arr, int x0, int y0) {
boolean[][] path = new boolean[SIZE][SIZE];
char[][] memory = new char[SIZE][SIZE];
for (int i = 0; i < SIZE; i++) {
for (int j = 0; i < SIZE; i++) {
path[i][j] = false;
}
}
int x = x0;
int y = y0;
while (x != 0 && y != 0) {
char direction = where_from(arr, x, y, memory);
if (direction == 'N') {
String m = "Нет такого пути";
return m;
} else if (direction == 'U') {
y -= 1;
} else if (direction == 'L') {
path[x][y] = true;
x -= 1;
}
}
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (x == x0 && y == y0) {
System.out.println(H);
} else if (path[x][y]) {
System.out.println(x);
} else
System.out.println(arr[x][y]);
}
}
return null;
}
public static char where_from(char[][] arr, int x, int y, char[][] memory) {
if (memory[x][y] != '\0') {
return memory[x][y];
}
if (x > 0) {
int left_x = x - 1;
int left_y = y;
if (left_x == 0 && left_y == 0) {
memory[left_x][left_y] = 'L';
return 'L';
}
if (arr[left_x][left_y] != '*') {
if (where_from(arr, left_x, left_y, memory) != 'N') {
memory[left_x][left_y] = 'L';
return 'L';
}
}
}
if (y > 0) {
int up_x = x;
int up_y = y - 1;
if (up_x == 0 && up_y == 0) {
if (where_from(arr, up_x, up_y, memory) != 'N') {
memory[up_x][up_y] = 'U';
return 'U';
}
}
}
memory[x][y] = 'N';
return 'N';
}
public static void conclusRandom(char[][] arr) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
arr[i][j] = E;
}
}
Random rand = new Random();
for (int i = 0; i < 21; i++) {
arr[rand.nextInt(SIZE)][rand.nextInt(SIZE)] = CACTUS;
}
arr[0][0] = DOG;
arr[8][3] = H;
}
public static void Print(char[][] arr) {
for (char[] row : arr) {
for (char cell : row) {
System.out.print(cell + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
char[][] arr = new char[SIZE][SIZE];
conclusRandom(arr);
find_path(arr, 0, 0);
Print(arr);
}
}