嗯,回溯直接暴力吧。在网上也看到了用树做的,没有细看。
回溯的话可以直接搜索没有被移动的牌,以及比它大的没有移动的牌,DFS,看代码吧:
#include <iostream> using namespace std; int s[11],v[11],ans; void DFS(int num,int sum) { if(sum>=ans) return; if(num==10) { ans=sum; return; } int i,j; for(i=1;i<=9;i++) if(!v[i]) { for(j=i+1;j<=10;j++) if(!v[j]) break; v[i]=1; DFS(num+1,sum+abs(s[i]-s[j])); v[i]=0; } } int main() { int i,t,cas; cin>>cas; while(cas--) { for(i=1;i<=10;i++) { cin>>t; s[t]=i; } memset(v,0,sizeof(v)); ans=0x7FFFFFFF; DFS(1,0); cout<<ans<<endl; } }