UVa 269 Counting Patterns(dfs+构造)
2015-04-22 20:05
155 查看
题意:
求出所有的n个绝对值不大于k的数的组成排列,排列的和为0。且对于一个排列,全部正负号翻转、排列顺序翻转、循环左移、循环右移所构成的新排列视为同一个排列,并要求按照字典序打印所有的排列。
解析:
参考了学长的解题报告,其思路是按照字典序构造出和为0的排列,且该排列的字典序是当前排列所有字典序最大的。然后记录下来,最后打印。AC代码
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef long long ll; const int N = 20; int n, K; int ans; int a , b[2*N]; int save[100005] ; bool bigger(int arr[], int arr2[]) { for(int i = 0; i < n; i++) { if(arr[i] != arr2[i]) return arr[i] > arr2[i]; } return false; } bool check() { for(int i = 0; i < n; i++)//move b[i] = b[i+n] = a[i]; for(int i = 0; i < n; i++) if(a[0] == b[i] && bigger(b+i, a)) return false; reverse(b, b+2*n); //reverse for(int i = 0; i < n; i++) if(a[0] == b[i] && bigger(b+i, a)) return false; //reversal for(int i = 0; i < 2*n; i++) b[i] = -b[i]; for(int i = 0; i < n; i++) if(a[0] == b[i] && bigger(b+i, a)) return false; //reverse reverse(b, b+2*n); for(int i = 0; i < n; i++) if(a[0] == b[i] && bigger(b+i, a)) return false; return true; } void printAns(int arr[]) { printf("(%d", arr[0]); for(int i = 1; i < n; i++) { printf(",%d", arr[i]); } puts(")"); } void dfs(int pos, int sum) { if(pos == n) { if(sum == 0 && check()) memcpy(save[ans++], a, sizeof(a)); return; } if(abs(sum) > (n-pos)*a[0]) return; //unbalance for(a[pos] = -a[0]; a[pos] <= a[0]; a[pos]++) { if(a[pos-1] == a[0] && a[pos] > a[1]) return; //出现3个大于a[pos] dfs(pos+1, sum+a[pos]); } } int main() { int cas = 0; while(scanf("%d%d", &n, &K) != EOF) { if(cas++) puts(""); memset(a, 0, sizeof(a)); ans = 1; for(a[0] = 1; a[0] <= K; a[0]++) { dfs(1, a[0]); } printf("%d\n", ans); for(int i = 0; i < ans; i++) { printAns(save[i]); } } return 0; }
相关文章推荐
- uva 269 - Counting Patterns(构造)
- uva548 比较经典的知道两种遍历序列构造二叉树,注意后面的dfs的回溯
- UVA 548 Tree 中序+后序构造二叉树dfs
- uva269(dfs)
- Uva 12009 平方数尾数与自身相同 dfs 构造
- UVA - 269 Counting Patterns 构造
- 习题 6-14 UVA - 12118 Inspector's Dilemma 检察员的难题 (DFS 构造欧拉通路)
- UVa 10562 - Undraw the Trees ( DFS )
- UVA 10655 Contemplation! Algebra(构造矩阵和快速幂)
- Editing a Book UVA - 11212(DFS+IDA*)
- uva 12253 - Simple Encryption(dfs)
- UVA 11384 Help is needed for Dexter(构造题)
- UVA 572 Oil Deposits(DFS)
- UVa 225 – Golygons [DFS+剪枝]
- UVALive 6088 Approximate Sorting 构造题
- HDU 4850 (构造 dfs)
- UVA 536 Tree Recovery 二叉树重建(重建二叉树+DFS)
- UVa 10911 Forming Quiz Teams(dfs)
- UVA-11882 bfs + dfs + 剪枝
- UVA 225 - Golygons(dfs回溯)