全排列的编码与解码

看《算法竞赛入门经典》 第七章, 隐式图的遍历,八数码一题。

学到了全排列的编码与解码

用处: 每一个排列代表一个图的状态, 比如 8,3,2,4,5,6,7,0,1

表示成图就是

8  3  2

4  5  6

7  0  1

我们将0~8的全排列和0~9!一一映射起来

比如0, 1, 2, 3, 4, 5, 6, 7, 8 对应的就是0, 因为是第一个排列组合

那么8 7 6 5 4 3 2 1 0 对应的就是9!,因为是最后一种排列组合。

 

算法实现如下:

int fact[9];   //假设排列组合范围是0~8
  
void init(){
  fact[0] = 1;   for (int i = 1; i < 9; i++) fact[i] = fact[i - 1] * i; } int transfer(int ar[9]) { int code = 0; for (int i = 0; i < 9; i++) { int cnt = 0; for (int j = i + 1; j < 9; j++) if (ar[j] < ar[i]) cnt++; code += fact[8 - i] * cnt; } return code; }

 

转载于:https://www.cnblogs.com/Bowen-/p/4944893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值