Хорошо, поэтому я пытаюсь создать Java-программу для решения платы Picross, но получаю сообщение об ошибке Stackoverflow. В настоящее время я просто учу себя немного Java, и поэтому мне нравится использовать вещи, которые я знаю, вместо того, чтобы найти решение онлайн, хотя мой путь, очевидно, не такой эффективный. Единственный способ, которым я мог придумать, чтобы решить это, был через грубую силу, пробуя любую возможность. Дело в том, что я знаю, что эта функция работает, потому что она работает для плат меньшего размера, единственная проблема заключается в том, что на более крупных платах я склонен получать ошибки до завершения функции.
так что char[][] a
- это просто игровое поле со всеми X и O. int[][] b
- это массив с номерами, назначенными для игровой доски, например, числа сверху и слева от игры. isDone()
просто проверяет, совпадает ли доска с заданными числами, а shift()
сдвигает один столбец вниз. Я не хотел вставлять всю свою программу, поэтому, если вам нужна дополнительная информация, дайте мне знать. Спасибо!
Я добавил код для смены, так как кто-то спросил. Shift просто перемещает все символы в одном ряду на одну ячейку.
Обновление: я думаю, что, возможно, мой код не проходит через каждую комбинацию, и поэтому он пропускает правильный ответ. Кто-нибудь может убедиться, что это на самом деле пробует все возможные комбинации? Потому что это объяснило бы, почему я получаю ошибки stackoverflow. С другой стороны, сколько итераций можно пройти, прежде чем это станет слишком много?
public static void shifter(char[][] a, int[][] b, int[] clockwork)
{
boolean correct = true;
correct = isDone(a, b);
if(correct)
return;
clockwork[a[0].length - 1]++;
for(int x = a[0].length - 1; x > 0; x--)
{
if(clockwork[x] > a.length)
{
shift(a, x - 1);
clockwork[x - 1]++;
clockwork[x] = 1;
}
correct = isDone(a, b);
if(correct)
return;
}
shift(a, a[0].length - 1);
correct = isDone(a, b);
if(correct)
return;
shifter(a, b, clockwork);
return;
}
public static char[][] shift(char[][] a, int y)
{
char temp = a[0][y];
for(int shifter = 0; shifter < a.length - 1; shifter++)
{
a[shifter][y] = a[shifter + 1][y];
}
a[a.length - 1][y] = temp;
return a;
}