文章:https://www.cnblogs.com/Mychael/p/8282895.html
康拓展开,知道数列求排名
//3 2 5 4 1 59
#include<bits/stdc++.h>
using namespace std;
int fac[20],sign[20],a[20],label[20],n;
void init(){
fac[0]=1;
for(int i=1;i<=10;i++)
fac[i]=fac[i-1]*i;
}
int kangtuo(int* a){
for(int i=0;i<n;i++)
sign[i]=1;
int paiming=0;
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<a[i];j++)
if(sign[j])
cnt++;
sign[a[i]]=0;
paiming+=cnt*fac[n-i-1];
}
return paiming;
}
int main(){
init();
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i],a[i]--;///第一位的排名是0,所以要自减
cout<<kangtuo(a)<<endl;
return 0;
}
康拓逆展开,知排名求数列
//10 5 1 3 4 5 2
#include<bits/stdc++.h>
using namespace std;
int ans[20],fac[20],sign[20],a[20],label[20],n;
void init(){
fac[0]=1;
for(int i=1;i<=10;i++)
fac[i]=fac[i-1]*i;
}
void nikangtuo(int paiming,int m){
paiming--;
int cnt;
for(int i=0;i<m;i++)
label[i]=1;
for(int i=0;i<m;i++){
cnt=paiming/fac[m-1-i];
paiming=paiming%fac[m-1-i];
for(int j=0;j<m;j++){
if(!label[j])
continue;
if(!cnt){
label[j]=0;
ans[i]=j;
break;
}
cnt--;
}
}
for(int i=0;i<m;i++)
cout<<ans[i]+1<<" ";
}
int main()
{
init();
int paiming,m;
cin>>paiming>>m;
nikangtuo(paiming,m);
}
http://poj.org/problem?id=1077
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int M=4e5+5; struct node{ int a[9]; }que[M],endd; int factorial[9],start[9]; char str[2],dir[]="lrdu",op[M]; int net[M],vis[M]; int nextx[4]={0,0,-1,1}; int nexty[4]={1,-1,0,0}; void init(){ factorial[0]=1; for(int i=1;i<9;i++) factorial[i]=factorial[i-1]*i; } int kang(int *a){ int v=0; for(int i=0;i<9;i++){ int countt=0; for(int j=i+1;j<9;j++) if(a[i]>a[j]) countt++; v+=countt*factorial[8-i]; } return v; } void bfs(int sign){ int head=0,tail=0; que[tail++]=endd; vis[sign]=1; while(head<tail){ node P=que[head++]; int now_sign=kang(P.a); int x,y,z; for(int i=0;i<9;i++){ if(P.a[i]==0){ x=i/3,y=i%3,z=i; break; } } node Q=P; for(int i=0;i<4;i++){ int tx=x+nextx[i]; int ty=y+nexty[i]; if(tx<0||ty<0||tx>=3||ty>=3) continue; int tz=tx*3+ty; Q.a[z]=P.a[tz]; Q.a[tz]=0; int Q_sign=kang(Q.a); if(!vis[Q_sign]){ vis[Q_sign]=1; op[Q_sign]=dir[i]; net[Q_sign]=now_sign; que[tail++]=Q; } Q=P; } } } int main(){ init(); for(int i=0;i<9;i++) if(i==8) endd.a[i]=0; else endd.a[i]=i+1; int sign=kang(endd.a); bfs(sign); while(~scanf("%s",str)){ if(str[0]=='x') start[0]=0; else start[0]=str[0]^48; for(int i=1;i<9;i++){ scanf("%s",str); if(str[0]=='x') start[i]=0; else start[i]=str[0]^48; } int start_sign=kang(start); if(vis[start_sign]){ while(sign!=start_sign){ putchar(op[start_sign]); start_sign=net[start_sign]; }putchar(' '); } else puts("unsolvable"); } return 0; }
https://www.luogu.org/problemnew/show/P2730
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<iostream> using namespace std; int mi(int x,int y){ return x<y?x:y; } inline int read(){ int sum=0,x=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') x=0; ch=getchar(); } while(ch>='0'&&ch<='9'){ sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar(); } return x?sum:-sum; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } const int M=4e5+5; struct node{ int a[8]; }que[M],endd; int fac[8],start[8]; char dir[]="ABC",op[M],anss[M]; int nextt[M],vis[M]; void init(){ fac[0]=1; for(int i=1;i<8;i++) fac[i]=fac[i-1]*i; } int kang(int *a){ int ans=0; for(int i=0;i<8;i++){ int countt=0; for(int j=i+1;j<8;j++) if(a[i]>a[j]) countt++; ans+=countt*fac[7-i]; } return ans; } void bfs(int sign){ int head=0,tail=0; que[tail++]=endd; vis[sign]=1; while(head<tail){ node P=que[head++]; int now_sign=kang(P.a); node Q=P; for(int i=0;i<3;i++){ //A if(i==0){ for(int j=0;j<=3;j++){ int t=Q.a[j]; Q.a[j]=Q.a[7-j]; Q.a[7-j]=t; } } //B else if(i==1){ Q.a[0]=P.a[3]; Q.a[1]=P.a[0]; Q.a[2]=P.a[1]; Q.a[3]=P.a[2]; Q.a[4]=P.a[5]; Q.a[5]=P.a[6]; Q.a[6]=P.a[7]; Q.a[7]=P.a[4]; } //C else{ Q.a[0]=P.a[0]; Q.a[1]=P.a[6]; Q.a[2]=P.a[1]; Q.a[3]=P.a[3]; Q.a[4]=P.a[4]; Q.a[5]=P.a[2]; Q.a[6]=P.a[5]; Q.a[7]=P.a[7]; } int Q_sign=kang(Q.a); if(!vis[Q_sign]){ vis[Q_sign]=1; op[Q_sign]=dir[i]; nextt[Q_sign]=now_sign; que[tail++]=Q; } Q=P; } } } int main(){ init(); for(int i=0;i<8;i++) endd.a[i]=i+1; int sign=kang(endd.a); bfs(sign); while(~scanf("%d",&start[0])){ for(int i=1;i<8;i++) start[i]=read(); int start_sign=kang(start); // string ss; int i=0; while(sign!=start_sign){ //putchar(op[start_sign]); //ss+=op[start_sign]; anss[i++]=op[start_sign]; start_sign=nextt[start_sign]; } write(i); putchar(' '); i--; for(;i>=0;i--) putchar(anss[i]); putchar(' '); } return 0; }