반응형

https://www.acmicpc.net/problem/10972

 

10972번: 다음 순열

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.

www.acmicpc.net

 

현재 재귀의 깊이에서 나와야하는 수(입력한 수)가 아니라면 모두 continue 시켜줬습니다.

그러다가 입력한 수가 한 번 나오면, 그때 플래그 변수로 더이상 continue 시키지않게 바꿔줬습니다.

그 다음으로 다시 cnt == n을 충족했을 때가 다음 순열입니다.

 

#include <iostream>
#include <algorithm>
int n, a[10000], v[10000] = { 0 }, b[10000], c[10000], f = 0, f1 = 1;
void fun(int cnt) {
	if (cnt == n) {
		f1 = 0;
		if (f) {
			for (int i = 0; i < n; i++) printf("%d ", c[i]);
			exit(0);
		}
		int i;
		for (i = 0; i < n; i++)
			if (b[i] != c[i]) break;
		if (i == n) f = 1;
		return;
	}
	for (int i = 0; i < n; i++) {
		if (f1 == 1 && a[i] != b[cnt]) continue;
		if (v[i]) continue;
		v[i] = 1;
		c[cnt] = a[i];
		fun(cnt + 1);
		v[i] = 0;
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) a[i] = i + 1;
	for (int i = 0; i < n; i++) scanf("%d", &b[i]);
	fun(0);
	printf("-1");
}

 

 

반응형

'Algorithm' 카테고리의 다른 글

백준 10819 : 차이를 최대로  (0) 2021.11.11
백준 10974 : 모든 순열  (0) 2021.11.11
백준 1476 : 날짜 계산  (0) 2021.11.11
백준 17281 : ⚾  (0) 2021.11.11
백준 17472 : 다리 만들기 2  (0) 2021.11.11

+ Recent posts