Вы решили запрограммировать летающего робота, который максимально быстро сможет пройти трехмерный лабиринт. Вам повезло, и у Вас есть план этого лабиринта. Внешне он выглядит как трёхмерный куб, состоящий из 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;
}
}
Скорее всего ты не учёл, что нужно вывести первый путь, либо где-то сравниваешь числа как строки. Код мне читать лень, поскольку там какая-то жесть.
Вероятно, задачу следует решать по-другому. Используй обычный bfs для поиска кратчайшего пути, но отсортируй массив направлений таким образом, чтобы лексикографически меньшие пути шли раньше.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости