把小的牌放到大的牌上,求最小移动的距离和
DFS遍历所有的可能,把每一张牌与之要移动的牌都进行两层for的循环,注意回溯条件满足立刻break
代码(算法借鉴)
#include <bits/stdc++.h>
using namespace std;
int sum,vis[20],num[20],ans;
void dfs(int cur,int sum)
{
if(sum>=ans)
return;
if(cur==9)
{
ans=sum;
return;
}
for(int i=1;i<=9;i++)
{
if(!vis[i])
{
vis[i]=1;
for(int j=i+1;j<=10;j++)
if(!vis[j])
{
dfs(cur+1,sum+abs(num[j]-num[i]));
break;
}
vis[i]=0;
}
}
}
main()
{
int t;
cin>>t;
while(t--)
{
for(int i=1;i<=10;i++)
{
int n;
cin>>n;
num[n]=i;
}
memset(vis,0,sizeof(vis));
ans=INT_MAX;
dfs(0,0);
cout<<ans<<endl;
}
}