pre{ white-space: pre; } .entry-content pre{ word-wrap: normal; }

重複のない数列の順列を返す関数

自分用のメモ
無駄なところがあると思いますが、初心者なので許してください。

import java.util.Scanner;

public class Main {

	static int n;
	static int[] c;
	static boolean[] used;
	static int[] perm;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		c = new int[n];
		for(int i = 0 ; i < n ; i++) c[i] = sc.nextInt();
		used = new boolean[n];
		perm = new int[n];
		dfs(0, n);
	}

	public static void dfs(int pos, int n) {
		if(pos == n) {
			for(int i = 0 ; i < n ; i++) {
				System.out.print(perm[i]);
			}
			System.out.println();
			return;
		}
		// permのpos番目をc[0]~c[n-1]のどれにするか
		for(int i = 0 ; i < n ; i++) {
			if(used[i] == false) {
				perm[pos] = c[i];
				// c[i]を使ったので、i番目は使ったというフラグを立てる
				used[i] = true;
				dfs(pos + 1, n);
				// 戻ってきたら、i番目のフラグを戻す
				used[i] = false;
			}
		}
		return;
	}

}

数列に重複する数字がある場合も深さ優先探索で実装したいが実力的にまだ時間が掛かりそう
実装できたら上げる予定