하나씩 하나씩 백트래킹하면 시간초과가 난다.
단적이지만 예제를 보면 간단한 법칙이 보인다. (8,7)의 자리가 바뀌고, (5,4), (2,3)의 자리가 바뀐다.
앞부터 차례대로 -1,0,+1의 숫자가 사용되었는지 확인 후 swap하는 방식으로 하면 풀린다.
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 | #include <stdio.h> #include <algorithm> using namespace std; int n, t, a[50001]; bool c[50001], d[50001]; bool solve(int x) { if (x == n) return true; if (d[x]) return solve(x + 1); for (int i = -1; i < 2; i++) { if (!c[a[x] + i] && a[x] + i > 0) { int target = x; for (int j = x + 1; j < n; j++) if (a[j] == a[x] + i) { target = j; break; } c[a[x]] = c[a[target]] = 1; d[target] = 1; swap(a[x], a[target]); if (solve(x + 1)) return true; c[a[x]] = c[a[target]] = 0; swap(a[x], a[target]); d[target] = 0; } } return false; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); solve(0); for (int i = 0; i < n; i++) printf("%d\n", a[i]); return 0; } | cs |
'BOJ' 카테고리의 다른 글
5619 세 번째 (0) | 2017.10.30 |
---|---|
3758 KCPC (0) | 2017.10.30 |
13226 Divisors Again (0) | 2017.10.30 |
14891 톱니바퀴 (0) | 2017.10.26 |
14890 경사로 (0) | 2017.10.26 |