Java, динамическое программирование

Рейтинг: -4Ответов: 1Опубликовано: 28.06.2023

Начал изучать динамическое программирование. Что-то ответ не нравится) Помогите найти ошибку!?

Условие: надо написать функцию, которая принимала бы параметрами поле в виде двумерного массива, две координаты клетки, в которой находится 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);
    }
 
}



  

Ответы

▲ 0

Во вложенном цикле for в методе find_path не так. Условие for (int j = 0; i < SIZE; i++) должно быть for (int j = 0; j < SIZE; j++). В условии цикла while в методе find_path логический оператор должен быть ||, а не &&. Условие должно быть while (x != 0 || y != 0). Во внутреннем цикле for в методе find_path, при выводе элементов, непрерывно выводите arr[x][y], вместо arr[i][j]. Замените System.out.println(arr[x][y]); на System.out.println(arr[i][j]);.

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 void main(String[] args) {
    char[][] arr = new char[SIZE][SIZE];
    conclusRandom(arr);
    Print(arr);
    find_path(arr, 0, 0);
}

public static void 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; j < SIZE; j++) {
            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 = "Нет такого пути";
            System.out.println(m);
            return;
        } 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.print(H + " ");
            } else if (path[i][j]) {
                System.out.print(DOG + " ");
            } else {
                System.out.print(arr[i][j] + " ");
            }
        }
        System.out.println();
    }
}

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();
    }
}

}