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