DFS爆搜+剪枝即可
#include "stdio.h"
#include "string.h"
#include "math.h"
int ans;
int hash[11],a[11];
void dfs(int w,int sum)
{
int i,j;
if (sum>ans) return ;
if (w==9) { ans=sum; return ;}
for (i=1;i<=10;i++)
if (hash[i]==0)
{
hash[i]=1;
for (j=i+1;j<=10;j++)
if (hash[j]==0)
{
dfs(w+1,sum+abs(a[i]-a[j]));
break;
}
hash[i]=0;
}
}
int main()
{
int Case,i,x;
scanf("%d",&Case);
while (Case--)
{
for (i=1;i<=10;i++)
{
scanf("%d",&x);
a[x]=i;
}
memset(hash,0,sizeof(hash));
ans=100000000;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}