проблемы с перестановками

У меня была та же проблема.

через несколько минут, я подумал, что я пытался загрузить файл.fxml из неправильного местоположения.

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
1
задан stickersskeletal 17 January 2019 в 06:01
поделиться

1 ответ

Давайте рассмотрим ваш алгоритм для ввода {1,2,3}:

  • Сначала вы добавляете 1 в tmp
  • Затем вы вызываете getPerm (2, [2, 3], [1], [])
  • Затем вы добавляете 2 к tmp
  • Затем вы вызываете geterm (1, [3], [1, 2], []) [116 ]
  • Затем вы добавляете 3 в tmp
  • Затем вы вызываете getPerm (0, [], [1, 2, 3], [])
  • Теперь вы добавляете первую перестановку [ 1, 2, 3] к результату и clear tmp
  • Поэтому следующей перестановке, которая должна быть [1, 3, 2], будет не хватать 1
[1112 ] Это можно исправить, если вместо очистки tmp каждый раз, когда вы добавляете к результату перестановку, вы удаляете только последний элемент, добавленный в tmp после рекурсивного вызова:

private void getPerm(int n, int[] a, ArrayList<Integer> tmp, ArrayList<List<Integer>> result)
{
    if(n == 0){
        ArrayList<Integer> toAdd = new ArrayList<Integer>(tmp);
        result.add(toAdd);
        // don't clear tmp here
        return;
    }
    for(int i = 0; i < n; i++){
        tmp.add(a[i]);
        int[] b = new int[n-1];
        int k = 0;
        int j = 0;
        while(k<b.length){
            if(a[i]==a[j]){j++;}
            else{b[k]=a[j]; k++; j++;}
        }

        getPerm(n-1, b, tmp, result);
        tmp.remove(tmp.size()-1); // remove the last element added to tmp
    }
}

Теперь вывод:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
0
ответ дан Eran 17 January 2019 в 06:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: