Кажется, что основное использование кучи в вашей программе действительно там, где вы подозреваете: при инициализации нового массива size pieces.length -1
.
Обратите внимание, что вы действительно можете сэкономить много места здесь! поскольку вы на самом деле используете только самый глубокий набор.
Если вы все еще хотите использовать массив, вы можете передать дополнительный параметр: start
и реализовать swap(arr,i,k)
, который меняет i-й и k-й элементы в arr, и вместо этого на каждом шаге выделения нового массива swap(pieces,start,i)
и передачи новой функции start+1
на рекурсивном этапе. обратите внимание, что, поскольку вы всегда меняете последний элемент, последующие шаги не заботятся о перестановках, поскольку они находятся после позиции start
массива. Так что в основном, потому что алгоритм никогда не «оглядывается назад», у вас нет проблем с обменом этих элементов ...
Должно выглядеть примерно так:
public board recursiveSolve(Board board, Piece[] pieces, int position,int start){
if(position == board.getLength())
return board;
else {
//starting from start instead from 0
for(int i = start; i < pieces.length; i++){
if(board.isValid(piece[i], position)){
board.putPiece(pieces[i], position);
swap(pieces,start,i); //the swap() method I mentioned above
//sending start+1:
if(recursiveSolve(board, subPieces, position + 1,start+1) != null)
return board;
else
board.removePiece(position);
}
}
return null;
}
Возможно, вы знаете, что алгоритмы обратного отслеживания отнимают много времени [экспоненциально!], Поэтому даже в оптимизированной для пространства версии алгоритм может работать очень долго, пока не будет найден ответ.