Что-то не так со мной или с задачей? [требует правки]

420
31 января 2017, 21:08

Вы решили запрограммировать летающего робота, который максимально быстро сможет пройти трехмерный лабиринт. Вам повезло, и у Вас есть план этого лабиринта. Внешне он выглядит как трёхмерный куб, состоящий из n3n3 маленьких кубиков и ограниченный со всех сторон стенкой. Все внутренние стены перпендикулярны сторонам куба, причем стоят они, разделяя внутренние кубики. У каждого внутреннего кубика есть своя целочисленная координата от 0 до n3−1n3−1, причём нумеруются они подряд идущими слоями, то есть для кубика с гранью 3:

первый слой:   второй слой:   третий слой:
00 01 02       09 10 11       18 19 20
03 04 05       12 13 14       21 22 23
06 07 08       15 16 17       24 25 26

Для лабиринтов больших размеров, аналогично.

На вход Вашей программе подается размер лабиринта n, координата входа в лабиринт(некоторая координата внутреннего кубика, лежащего на одной из граней), координата выхода из кубика (некоторая координата внутреннего кубика, лежащего на одной из граней, не совпадающая с координатами входа) и количество внутренних стен k, за которым следует соответственное количество пар координат кубиков, между которыми стоит стена. Ваша задача через пробел вывести наикратчайшую последовательность координат, по которым пролетит робот от входа к выходу. Если таких последовательностей несколько – выведите наименьшую. Например, в первом тесте различных путей 6:

0 1 3 7 ; 0 1 5 7 ; 0 2 3 7 ; 0 2 6 7 ; 0 4 5 7 ; 0 4 6 7

Они упорядочены по возрастанию, поэтому ответ к задаче -- 0 1 3 7.

Если до выхода добраться нельзя, выведите «-1».

Я решил эту задачу но у меня не проходит 9 тест на степике

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int kol, entry, exit, k, xEn = 0, yEn = 0, xEx = 0, yEx = 0, zEn = 0, zEx = 0;
        Scanner scanner = new Scanner(System.in);
        kol = scanner.nextInt();
        entry = scanner.nextInt();
        exit = scanner.nextInt();
        k = scanner.nextInt();
        ArrayList<String> list = new ArrayList<>();
        int[][][] massiv = new int[kol][kol][kol];
        int[] massiv2 = new int[kol * kol * kol];
        ArrayList<String> lis = new ArrayList<>();
        ArrayList<Integer> questStr = new ArrayList<>();
        if (k != 0) {
            for (int i = 0; i < k; i++) {
                int num1 = scanner.nextInt();
                int num2 = scanner.nextInt();
                String numer = num1 + " " + num2;
                list.add(numer);
            }
        }
        scanner.close();
        int i1 = 0;
        for (int z = 0; z < kol; z++) {
            for (int y = 0; y < kol; y++) {
                for (int x = 0; x < kol; x++) {
                    massiv[x][y][z] = i1;
                    massiv2[i1] = -1;
                    if (i1 == entry) {
                        xEn = x;
                        yEn = y;
                        zEn = z;
                    }
                    if (i1 == exit) {
                        xEx = x;
                        yEx = y;
                        zEx = z;
                    }
                    i1++;
                }
            }
        }

        massiv2 = createMap(xEn, yEn, massiv2, massiv, kol, entry);
        /*for (int z = 0; z < kol; z++) {
            for (int y = 0; y < kol; y++) {
                for (int x = 0; x < kol; x++) {
                    System.out.print(massiv2[massiv[x][y][z]] + " ");
                }
                System.out.print("\n");
            }
            System.out.println();
        }*/
        lis = findPuth(massiv, kol, massiv2, entry, exit, zEn, zEx, exit, String.valueOf(""), lis, list);
        if (lis.size() > 0) {
            Long min = Long.valueOf(lis.get(0).replace(" ", ""));
            String minimum = lis.get(0);
            for (int i = 0; i < lis.size(); i++) {
                if (Long.valueOf(lis.get(i).replace(" ", "")) < min){
                    min = Long.valueOf(lis.get(i).replace(" ", ""));
                    minimum = lis.get(i);
                }
            }
            System.out.println(minimum);
        } else System.out.println(-1);
    }
    public static int[] createMap(int xEn, int yEn, int[] massiv2, int[][][] massiv, int kol, int entry) {
        massiv2[entry] = 0;
        int m1, m2, m3, m4, d, i = 0, x, y, z;
        String findNumber;
        String number;
        while (true) {
            number = Arrays.toString(massiv2);
            if (i == kol * kol * kol && number.contains(String.valueOf(-1))) i = 0;
            if (i == kol * kol * kol && !number.contains(String.valueOf(-1))) break;
            if (!number.contains(String.valueOf(-1))) break;
            if (massiv2[i] > 0 || (massiv2[i] == 0 && i == entry)) {
                findNumber = findNumberInMass(massiv, i, kol);
                x = Integer.parseInt(findNumber.split(" ")[0]);
                y = Integer.parseInt(findNumber.split(" ")[1]);
                z = Integer.parseInt(findNumber.split(" ")[2]);
                d = massiv2[i];
                if (x == xEn && y == yEn && z + 1 < kol && massiv2[massiv[x][y][z + 1]] == -1)
                    massiv2[massiv[x][y][z + 1]] = d + 1;
                if (x == xEn && y == yEn && z - 1 >= 0 && massiv2[massiv[x][y][z - 1]] == -1)
                    massiv2[massiv[x][y][z - 1]] = d + 1;
                if (x - 1 >= 0) {
                    m1 = massiv[x - 1][y][z];
                    if (massiv2[m1] == -1 && m1 != entry)
                        massiv2[m1] = d + 1;
                }
                if (x + 1 < kol) {
                    m3 = massiv[x + 1][y][z];
                    if (massiv2[m3] == -1 && m3 != entry)
                        massiv2[m3] = d + 1;
                }
                if (y - 1 >= 0) {
                    m2 = massiv[x][y - 1][z];
                    if (massiv2[m2] == -1 && m2 != entry)
                        massiv2[m2] = d + 1;
                }
                if (y + 1 < kol) {
                    m4 = massiv[x][y + 1][z];
                    if (massiv2[m4] == -1 && m4 != entry)
                        massiv2[m4] = d + 1;
                }
            }
            i++;
        }
        return massiv2;
    }

    public static String findNumberInMass(int masiv2[][][], int needFind, int kol) {
        for (int z = 0; z < kol; z++) {
            for (int y = 0; y < kol; y++) {
                for (int x = 0; x < kol; x++) {
                    if (masiv2[x][y][z] == needFind) return x + " " + y + " " + z;
                }
            }
        }
        return String.valueOf(0);
    }
    public static ArrayList<String> findPuth(int masiv[][][], int kol, int masiv2[],
                                             int entry, int exit, int zEn, int zEx, int i,
                                             String questStr, ArrayList<String> lis, ArrayList<String> list) {
        int x;
        int y;
        int z;
        int m1;
        int m2;
        int m3;
        int m4;
        int z1;
        int z2;
        questStr += i + " ";
        String findNumber = findNumberInMass(masiv, i, kol);
        x = Integer.parseInt(findNumber.split(" ")[0]);
        y = Integer.parseInt(findNumber.split(" ")[1]);
        z = Integer.parseInt(findNumber.split(" ")[2]);
        if (z - 1 >= 0 && zEn < zEx) {
            z2 = masiv[x][y][z - 1];
            if (masiv2[z2] + 1 == masiv2[i] && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(z2))
                    && (!list.contains(z2 + " " + i) && !list.contains(i + " " + z2)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, z2, questStr, lis, list);
            }
        }
        if (z + 1 < kol && zEn > zEx) {
            z1 = masiv[x][y][z + 1];
            if ( masiv2[z1] - 1 == masiv2[i] && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(z1))
                    && (!list.contains(z1 + " " + i) && !list.contains(i + " " + z1)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, z1, questStr, lis, list);
            }
        }
        if (y - 1 >= 0) {
            m4 = masiv[x][y - 1][z];
            if ((masiv2[m4] + 1 == masiv2[i] || masiv2[m4] - 1 == masiv2[i]) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(m4))
                    && (!list.contains(m4 + " " + i) && !list.contains(i + " " + m4)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, m4, questStr, lis, list);
            }
        }
        if (x - 1 >= 0) {
            m3 = masiv[x - 1][y][z];
            if ((masiv2[m3] + 1 == masiv2[i] || masiv2[m3] - 1 == masiv2[i]) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(m3))
                    && (!list.contains(m3 + " " + i) && !list.contains(i + " " + m3)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, m3, questStr, lis, list);
            }
        }
        if (y + 1 < kol) {
            m2 = masiv[x][y + 1][z];
            if ((masiv2[m2] + 1 == masiv2[i] || masiv2[m2] - 1 == masiv2[i]) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(m2))
                    && (!list.contains(m2 + " " + i) && !list.contains(i + " " + m2)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, m2, questStr, lis, list);
            }
        }
        if (x + 1 < kol) {
            m1 = masiv[x + 1][y][z];
            if ((masiv2[m1] + 1 == masiv2[i] || masiv2[m1] - 1 == masiv2[i]) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(m1))
                    && (!list.contains(m1 + " " + i) && !list.contains(i + " " + m1)) && !Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
                findPuth(masiv, kol, masiv2, entry, exit, zEn, zEx, m1, questStr, lis, list);
            }
        }
        if (Arrays.asList(questStr.split(" ")).contains(String.valueOf(entry))) {
            if (questStr.replace(" ", "").length() < 20){
                String a = "";
                List<String> list1 = Arrays.asList(questStr.split(" "));
                for (int j = list1.size()-1 ; j >= 0; j--){
                    a += list1.get(j) + " ";
                }
                lis.add(a);
            }
        }
        return lis;
    }
}
Answer 1

Скорее всего ты не учёл, что нужно вывести первый путь, либо где-то сравниваешь числа как строки. Код мне читать лень, поскольку там какая-то жесть.

Вероятно, задачу следует решать по-другому. Используй обычный bfs для поиска кратчайшего пути, но отсортируй массив направлений таким образом, чтобы лексикографически меньшие пути шли раньше.

READ ALSO
Отправка нескольких координат на Google Navigator

Отправка нескольких координат на Google Navigator

При отправлении нескольких координат на Google Navigator, пишет "не найден маршрут"

359
Обновляются не все поля в Hibernate

Обновляются не все поля в Hibernate

Есть вот такой вот метод в класса TaskDAO:

386
Странная работа задержки TimeUnit

Странная работа задержки TimeUnit

Нужно чтобы сразу после нажатия появился текст, а через секунду продолжилось бы выполнениеНа деле выходит все не так - задержка срабатывает...

321
побитовые сдвиги

побитовые сдвиги

Условие задачи:

977