搜索。状态表示:第几大的box在第几个槽中,压成一个整数。最大情况n=7即压成一个7位7进制数。复杂度7^7,我用vectorTLE,换成数组就过了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int encode(int* arr,int size){
int res=0;
for(int i=0;i<size;i++){
res*=size;
res+=arr[i];
}
return res;
}
int vec[7]; //解码放在此数组中。。
void decode(int x,int size){
int tmp[7];
for(int i=0;i<size;i++){
tmp[i]=x%size;
x/=size;
}
vector<int> res;
int pos=0;
for(int i=size-1;i>=0;i--){
vec[pos++]=tmp[i];
}
}
int ans1[1];
int ans2[4];
int ans3[27];
int ans4[256];
int ans5[3125];
int ans6[46656];
int ans7[823543];
void bfs(int* arr,int size){
int arrsize=1;
for(int i=0;i<size;i++)arrsize*=size;
for(int i=0;i<arrsize;i++)arr[i]=-1;
int vstart[7];
for(int i=0;i<size;i++){
vstart[i]=i;
}
int start=encode(vstart,size);
arr[start]=0;
queue<int> que; que.push(start);
while(que.size()){
int cur=que.front(); que.pop();
decode(cur,size);
//找每个槽里最小的。。
int MIN[7]={10,10,10,10,10,10,10};
for(int i=0;i<size;i++){
if(i<MIN[vec[i]]){
MIN[vec[i]]=i;
}
}
//枚举移动的槽位
for(int i=0;i<size;i++){
//left
if(i>0){
if(MIN[i]<MIN[i-1]){
int newnode[7];
for(int j=0;j<size;j++){
newnode[j]=vec[j];
}
newnode[MIN[i]] = i-1;
int newcode = encode(newnode,size);
if(-1==arr[newcode]){
arr[newcode]=arr[cur]+1;
que.push(newcode);
}
}
}
//right
if(i<size-1){
if(MIN[i]<MIN[i+1]){
int newnode[7];
for(int j=0;j<size;j++){
newnode[j]=vec[j];
}
newnode[MIN[i]] = i+1;
int newcode = encode(newnode,size);
if(-1==arr[newcode]){
arr[newcode]=arr[cur]+1;
que.push(newcode);
}
}
}
}
}
}
int main(){
bfs(ans1,1);
bfs(ans2,2);
bfs(ans3,3);
bfs(ans4,4);
bfs(ans5,5);
bfs(ans6,6);
bfs(ans7,7);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a[10];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int tmp[10];
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<n;j++){
if(a[j]<a[i])cnt++;
}
tmp[cnt]=i;
}
int ans;
if(n==1){
ans = ans1[encode(tmp,n)];
}else if(n==2){
ans = ans2[encode(tmp,n)];
}else if(n==3){
ans = ans3[encode(tmp,n)];
}else if(n==4){
ans = ans4[encode(tmp,n)];
}else if(n==5){
ans = ans5[encode(tmp,n)];
}else if(n==6){
ans = ans6[encode(tmp,n)];
}else if(n==7){
ans = ans7[encode(tmp,n)];
}
printf("%d\n",ans);
}
return 0;
}