1 条题解
-
0
C++ :
#include <cstdio> /* 值 v 的两次出现在位置差 v+1 处。从左到右填第一个空位, 候选值按升序尝试 ⇒ 首个完整解就是字典序最小的数列。 */ static int vals[10], n, L; static int pos[20], used[20], arr[20]; int dfs(int p){ while(p <= L && pos[p] != -1) p++; if(p > L) return 1; for(int i = 0; i < n; i++){ int v = vals[i]; if(used[i]) continue; int q = p + v + 1; if(q <= L && pos[q] == -1){ pos[p] = pos[q] = v; arr[p] = arr[q] = v; used[i] = 1; if(dfs(p + 1)) return 1; pos[p] = pos[q] = -1; used[i] = 0; } } return 0; } int main(){ int N; if(scanf("%d", &N) != 1) return 0; n = N; for(int i = 0; i < N; i++) scanf("%d", &vals[i]); for(int i = 0; i < N; i++) for(int j = i + 1; j < N; j++) if(vals[i] > vals[j]){ int t = vals[i]; vals[i] = vals[j]; vals[j] = t; } L = 2 * N; for(int i = 0; i <= L; i++) pos[i] = -1; if(dfs(1)){ for(int i = 1; i <= L; i++) printf("%d%c", arr[i], i == L ? '\n' : ' '); } else printf("-1\n"); return 0; }
- 1
信息
- ID
- 2831
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者