http://acm.hdu.edu.cn/showproblem.php?pid=1584
思路:用深搜枚举每一种情况,剪枝
难点主要在判断每种情况的合法性
1 for(i=1;i<=10;++i){ 2 int x; 3 cin>>x; 4 num[x] = i;/*用下标表示每个数字,数值记录位置 5 数字则变成升序的排列 6 在堆叠时若发现右边已经被使用则所要的卡牌必然再更后面*/ 7 }
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 struct Node{ 5 int min; 6 int max; 7 }; 8 int num[11]; 9 int used[11]; 10 int ans; 11 void DFS(int rank,int sum){ 12 if(sum > ans){//剪枝 13 return; 14 } 15 if(rank == 9){//递归出口 16 ans = sum; 17 return; 18 } 19 int i,j; 20 for(i=1;i<=10;i++){ 21 if(!used[i]){//枚举每一种可能 22 for(j=i+1;j<=10;j++){//这个for判断枚举的可能性是否合法 23 if(!used[j]){//判断1时,发现2,3已被使用说明2,3都被放在了4的位置上 24 used[i] = 1; 25 DFS(rank+1,sum+abs(num[i]-num[j])); 26 break; 27 } 28 } 29 used[i] = 0; 30 } 31 } 32 } 33 int main(){ 34 int T; 35 cin>>T; 36 while(T--){ 37 int i; 38 for(i=1;i<=10;++i){ 39 int x; 40 cin>>x; 41 num[x] = i;/*用下标表示每个数字,数值记录位置 42 数字则变成升序的排列 43 在堆叠时若发现右边已经被使用则所要的卡牌必然再更后面*/ 44 } 45 ans = 0x3fffffff; 46 DFS(0,0); 47 cout<<ans<<endl; 48 } 49 return 0; 50 }