全排列方法二(康托展开)
2017-03-18 14:45
288 查看
#include<cstdio> const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};///阶乘 int KT(int s[], int n) { int i, j, cnt, sum; sum = 0; for (i = 0; i < n; ++i) { cnt = 0; for (j = i + 1; j < n; ++j) if (s[j] < s[i]) ++cnt; sum += cnt * fac[n - i - 1]; } return sum; } int main() { int a[] = {3, 5, 7, 4, 1, 2, 9, 6, 8}; printf("%d\n", 1 + KT(a, sizeof(a) / sizeof(*a))); ///1+98884 }
#include<cstdio> #include<cstring> const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};///阶乘 bool vis[10]; ///n为ans大小,k为全排列的编码 void invKT(int ans[], int n, int k) { int i, j, t; memset(vis, 0, sizeof(vis)); --k; for (i = 0; i < n; ++i) { t = k / fac[n - i - 1]; for (j = 1; j <= n; j++) if (!vis[j]) { if (t == 0) break; --t; } ans[i] = j, vis[j] = true; k %= fac[n - i - 1];///余数 } } int main() { int a[10]; invKT(a, 5, 16); for (int i = 0; i < 5; ++i) printf("%d ", a[i]);///1 4 3 5 2 }
相关文章推荐
- VC中工具栏按钮文字及左右排列设置方法
- c#字符串反序排列方法
- 如果想在输出面板中排列出一个乘法口诀表请用以下方法
- 怎么把数组转递给方法,并返回按从小到大排列后,返回数组!
- Collections 自然数排列方法、最大值、最小值
- Oracle 按照指定顺序排列方法
- img对象间产生间隙和排列不整齐的解决方法
- DataList排列方法
- 用递归的方法判断整数组a[N]是不是升序排列
- 递归方法的使用之一 -- 用递归进行排列组合
- 黑莓:简单方法解决两个以上 Field 左右排列的问题
- 从大到小排列两个数(指针的两种方法)
- js 合并单元格的方法(使用直接调用数据时排列好的)
- C#实现“数学排列”的方法-----P(N,N)
- 网上找的“后补法”全排列方法
- GridView 后台排列 Column 、 用户自定义GridView 显示、GridView的PreRender ,Init,Load 方法
- 如何把资源管理器默认排列方式,设置为按修改日期排列图标的方法?
- css 标题一行图片 两行文字的排列方法以及相关问题处理
- flash中乱数排列(随机数)方法
- 将一数组乱序排列的三种方法