HDU 1584 蜘蛛牌

题解:纸牌只能移到比其大一的纸牌上,所以移动方向是定的,那么,就只有选择移动先后的问题了,对于决定要移的纸牌,比如1,如果2,3,4都是visited的状态,那么1一定是要移动到5的,因为2,3,4一定是全在5上了,清楚这一点,这道题就变得很简单的:

#include <cstdio> 
#include <iostream>
using namespace std;
int V[15],a[15],ans;
void dfs(int now,int step){
    if (now>=ans) return;
    if (step==9){ans=now;return;}
    for(int i=1;i<10;i++)
    if(!V[i]){
        for(int j=i+1;j<=10;j++){
            if(!V[j]){
                V[i]=true;
                dfs(now+abs(a[i]-a[j]),step+1);
                break;
            }
        }
        V[i]=false;
    }
}
int main(){
    int T,sit; 
    scanf("%d",&T);
    while(T--){
        ans=999999999;
        for(int i=1;i<=10;i++){ 
            scanf("%d",&sit);
            a[sit]=i;
        }
        memset(V,false,sizeof(V)); 
        dfs(0,0);
        printf("%d\n",ans);        
    }
    return 0;
}
posted @ 2014-02-10 14:16  forever97  阅读(175)  评论(0编辑  收藏  举报