Я пытаюсь решить проблему, связанную с шахматами. Программа должна принять количество возможных координат (номеров ящиков) в качестве входных данных от пользователя, например, NN, а затем рассчитать общее число путем умножения N x N, чтобы они стали числом возможных шагов, которые необходимо предпринять для перемещения одного места в другое. ,Затем программа берет начальную точку SS и конечные точки EE и выполняет вычисление, сколько шагов потребуется для достижения конечной точки.
Для первого случая, который равен 8 x 8 (возможные координаты или блоки на борту) 0 0(Начальная точка) 7 7 (конечная точка) дает значение 6 (Необходимые шаги)
Для второго случая, который равен 1000 x 7000 (Возможные координаты или поля на борту) 253 6789 (Начальная точка) 253 6789(конечная точка) дает значение 0 (необходимые шаги)
Для третьего случая, который равен 8 x 100000000 (возможные координаты или прямоугольники на борту) 3 3 (начальная точка) 3 999999999 (конечная точка) он даетошибка Java Heap Space
Может ли одна возможность попробовать этот код? и посмотреть, что может быть возможным решением? Можем ли мы контролировать пространство кучи с помощью кода Java?
Пример ввода один 8 8 0 0 7 7
Пример вывода один 6
Пример ввода два 1000 7000 253 6789 253 6789
Пример выходных данных 2 0
Пример входных данных Три 8 1000000000 3 3 3 999999999
Пример выходных данных 3 499999998 (но я получаю ошибку вывода из пространства кучи Java)
Мой код выглядит следующим образом
import java.util.Scanner;
import java.util.Vector;
class KattisProblemC {
static class cell {
int x, y;
int dis;
public cell(int x, int y, int dis) {
this.x = x;
this.y = y;
this.dis = dis;
}
}
static boolean isInside(int x, int y, int N) {
if (x >= 1 && x <= N && y >= 1 && y <= N)
return true;
return false;
}
static int minStepToReachTarget(int knightPos[], int targetPos[], int N) {
int dx[] = { -2, -1, 1, 2, -2, -1, 1, 2 };
int dy[] = { -1, -2, -2, -1, 1, 2, 2, 1 };
Vector<cell> q = new Vector<>();
q.add(new cell(knightPos[0], knightPos[1], 0));
cell t;
int x, y;
boolean visit[][] = new boolean[N + 1][N + 1];
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
visit[i][j] = false;
visit[knightPos[0]][knightPos[1]] = true;
while (!q.isEmpty()) {
t = q.firstElement();
q.remove(0);
if (t.x == targetPos[0] && t.y == targetPos[1])
return t.dis;
for (int i = 0; i < 8; i++) {
x = t.x + dx[i];
y = t.y + dy[i];
if (isInside(x, y, N) && !visit[x][y]) {
visit[x][y] = true;
q.add(new cell(x, y, t.dis + 1));
System.gc();
}
}
}
return Integer.MAX_VALUE;
}
public static void main(String[] args) {
Scanner myInput = new Scanner(System.in);
int firstIndex = myInput.nextInt();
int secondIndex = myInput.nextInt();
int f1 = myInput.nextInt();
int f2 = myInput.nextInt();
int f3 = myInput.nextInt();
int f4 = myInput.nextInt();
int N = secondIndex;
int knightPos[] = { f1, f2 };
int targetPos[] = { f3, f4 };
System.out.println(minStepToReachTarget(knightPos, targetPos, N));
}
}