1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| package org.stone.study.algo.ex202411;
import java.util.*;
public class ArchaeologistProblem {
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(); scanner.nextLine(); String[] fragments = scanner.nextLine().split(" "); LinkedHashSet<String> result = new LinkedHashSet<>(); Deque<String> oneSolution = new ArrayDeque<>(); boolean visited[] = new boolean[fragments.length]; Arrays.fill(visited, false); Arrays.sort(fragments); backtrack(fragments, visited, result, oneSolution);
result.forEach(System.out::println); }
private static void backtrack(String[] fragments, boolean[] visited, Set<String> result, Deque<String> oneSolution) { if(oneSolution.size() == fragments.length) { result.add(String.join("", oneSolution)); return; }
for(int i = 0; i < fragments.length; i++) { if(visited[i]) { continue; } if(i > 0 && fragments[i].equals(fragments[i-1]) && !visited[i-1]) { continue; }
visited[i] = true; oneSolution.addLast(fragments[i]); backtrack(fragments, visited, result, oneSolution); visited[i] = false; oneSolution.removeLast(); } } }
|