题目http://acm.hdu.edu.cn/showproblem.php?pid=1584
选择合理的dfs策略。
dfs+剪枝
代码:
#include<iostream>
using namespace std;
int ans;
int a[11];
int mark[11];
void dfs(int num,int sum) //他是一张张牌进行处理
{ int i,j;
if(sum>=ans) return;
if(num==9) { ans=sum; return ; }
for(i=1;i<10;i++) //体现搜索的策略
{ if(!mark[i])
{ mark[i]=1;
for(j=i+1;j<=10;j++)
{ if(!mark[j])
{
dfs(num+1,sum+abs(a[j]-a[i]));
break;
}
}
mark[i]=0;
}
}
}
int main()
{
int t; cin>>t;
int x;
while(t--)
{ for(int i=1;i<=10;i++)
{ cin>>x; a[x]=i;
}
memset(mark,0,sizeof(mark));
ans=100000;
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}