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;

}

你可能感兴趣的:(HDU)