[伯俊]BOJ 15649 JAVA


BOJ 15649 NとM(1)

質問する


自然数NとMが与えられた場合、以下の条件を満たすすべての長さMの数列を解くプログラムを作成します.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

入力


第1行は自然数NとMを与える.(1 ≤ M ≤ N ≤ 8)

しゅつりょく


各行に問題条件を満たす数列を出力します.重複する数列は複数回出力できません.各数列はスペースで区切らなければなりません.
数列は予め増加した順序で出力しなければならない.

サンプルI/O



ソースコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static int n, m;
    private static int arr[];
    private static boolean visit[];
    private static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        arr = new int[m];
        visit = new boolean[n];
        backtracking(0);

        System.out.println(sb.toString());
    }

    private static void backtracking(int depth) {
        if (depth == m) {
            //끝에 다다랐을 때, 출력.
            for (int num : arr) {
                sb.append(num).append(" ");
            }
            sb.append('\n');
            return;
        }

        for (int i = 0; i < n; i++) {
            if (!visit[i]) {
                visit[i] = true;
                arr[depth] = i + 1;
                backtracking(depth + 1);
                visit[i] = false;
            }
        }
    }
}

Comment


  • の典型的な조합の形態.典型的なBackTracking形態.典型的だが、最も深く学ぶ必要がある.