在做 九宫重排这道题的时候get到这个知识点,写下来。
这道题是一道bfs题,但是 在判重的时候很麻烦,二维数组。
所以先优化成一维数组,然后用康拓展开 压缩成它在全排列中的位置,来判重,这样才能避免超时。
这是康拓展开的核心代码,那道题是0-8.自己算了前几个数阶乘。
#include<stdio.h>//康拓展开
// X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!
// 其中,a[i]为整数,并且X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!
//X即为该序列在全排列中的位置
int fac[10]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};//前几个数的阶乘
int cantor(int s[]) //0-8 9个数的序列
{
int ans=0;
int n=9;
for (int i=0;i<9;i++)
{
int tmp=0;
for(int j=i+1;j<n;j++)
if(s[j]<s[i])
tmp++;
ans+= fac[n-1-i]*tmp;
}
return ans; //ans 即为该序列在全排列中的位置
}
逆展开等我心情好时再看,哈哈哈哈哈哈!!