思路 : 这个题就是深搜,然后剪一下枝(就是优化一下)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int T,ans;
int book[15];
int a[15];
void dfs(int step,int ans2){
if(ans2>ans)
return;
if(step==10)
{ans=ans2;
return;}
for(int i=1;i<=9;i++){
if(book[i]==0){
book[i]=1;
for(int j=i+1;j<=10;j++){
if(book[j]==0){
ans2+=abs(a[i]-a[j]);
dfs(step+1,ans2);
ans2-=abs(a[i]-a[j]); //因为这个地方wa了三次,忘记回复ans2的值了
break;
}
}
book[i]=0;
}
}
}
int main(){
int num;
scanf("%d",&T);
while(T--){
ans=199999;
memset(book,0,sizeof(book));
for(int i=1;i<=10;i++){
scanf("%d",&num);
a[num]=i; //下标是值, a[num]表示这个值所在的位置
}
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}