杭电 HOJ 1584 蜘蛛牌 解题报告

    嗯,回溯直接暴力吧。在网上也看到了用树做的,没有细看。

    回溯的话可以直接搜索没有被移动的牌,以及比它大的没有移动的牌,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;

    }

}

 

你可能感兴趣的:(杭电)