HDU1195 Open the Lock单向广搜

/*RESCUE*/

#include <iostream>

#include<cstdio>

#include<cstring>

#include<queue>

#include<set>

#include<memory.h>

#include<algorithm>

using namespace std;

#define maxn 220

char start[6],end[6];

bool vis[10005];

struct re

{

    int str[4];

    int num;

    re(const char *a)

    {

        num=0;

        for(int i=0; i<4; ++i)

            str[i]=a[i]-'0';

    }

    int cal()

    {

        return str[0]*1000+str[1]*100+str[2]*10+str[3];

    }

    bool operator ==(const re &tt) const

    {

        for(int i=0; i<4; ++i)

            if(str[i]!=tt.str[i]) return false;

        return true;

    }

};

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%s%s",start,end);

        re End(end);

        queue<re> Q;

        Q.push(start);

        memset(vis,false,sizeof(vis));

        while(!Q.empty())

        {

            re Beg=Q.front();

            Q.pop();

            if(Beg==End)

            {

                printf("%d\n",Beg.num);

                break;

            }

            Beg.num++;

            int pp;

            for(int pos=0; pos<4; pos++)

            {

                Beg.str[pos]++;

                if(Beg.str[pos]==10) Beg.str[pos]=1;

                if(!vis[pp=Beg.cal()])

                {

                    vis[pp]=true;

                    Q.push(Beg);

                }

                Beg.str[pos]--;

                if(Beg.str[pos]==0) Beg.str[pos]=9;

                Beg.str[pos]--;

                if(Beg.str[pos]==0) Beg.str[pos]=9;

                if(!vis[pp=Beg.cal()])

                {

                    vis[pp]=true;

                    Q.push(Beg);

                }

                Beg.str[pos]++;

                if(Beg.str[pos]==10) Beg.str[pos]=1;

            }

            for(int pos=0; pos<3; pos++)

            {

                int tmp=Beg.str[pos];

                Beg.str[pos]=Beg.str[pos+1];

                Beg.str[pos+1]=tmp;

                if(!vis[pp=Beg.cal()])

                {

                    vis[pp]=true;

                    Q.push(Beg);

                }

                tmp=Beg.str[pos];

                Beg.str[pos]=Beg.str[pos+1];

                Beg.str[pos+1]=tmp;

            }

        }

    }

}

 

你可能感兴趣的:(Lock)