Cod sursa(job #2230182)

Utilizator radustn92Radu Stancu radustn92 Data 9 august 2018 13:20:40
Problema Generare de permutari Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 2.8 kb
import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("permutari.in");
        OutputStream outputStream = new FileOutputStream("permutari.out");

        try (InputReader inputReader = new InputReader(inputStream);
            PrintWriter printWriter = new PrintWriter(outputStream)) {

            int N = inputReader.nextInt();
            Solver.solve(N, new CustomConsumer<int[]>() {
                @Override
                public void accept(int[] solution) {
                    for (int i = 0; i < solution.length; i++) {
                        printWriter.print(solution[i] + " ");
                    }
                    printWriter.println();
                }
            });
        }
    }

    static class Solver {

        public static void solve(int N, CustomConsumer<int[]> permHandler) {
            int[] partialPermutation = new int[N];
            BitSet inPartialPerm = new BitSet(N + 1);
            solve(N, 0, partialPermutation, inPartialPerm, permHandler);
        }

        private static void solve(int N, int currElems, int[] partialPerm, BitSet inPartialPerm, CustomConsumer<int[]> permHandler) {
            if (currElems == N) {
                permHandler.accept(partialPerm);
                return;
            }

            for (int nextElem = 1; nextElem <= N; nextElem++) {
                if (!inPartialPerm.get(nextElem)) {
                    inPartialPerm.set(nextElem);
                    partialPerm[currElems] = nextElem;
                    solve(N, currElems + 1, partialPerm, inPartialPerm, permHandler);

                    // roll back changes
                    inPartialPerm.clear(nextElem);
                }
            }
        }
    }

    public interface CustomConsumer<T> {

        void accept(T t);
    }

    static class InputReader implements AutoCloseable {

        private BufferedReader bufferedReader;

        private StringTokenizer stringTokenizer;

        public InputReader(InputStream inputStream) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            stringTokenizer = null;
        }

        public String nextToken() {
            if (stringTokenizer == null || !stringTokenizer.hasMoreTokens()) {
                try {
                    stringTokenizer = new StringTokenizer(bufferedReader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            return stringTokenizer.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(nextToken());
        }

        @Override
        public void close() throws IOException {
            bufferedReader.close();
        }
    }
}