hdu1195 Open the Lock

双向搜索,直接把字符串转换成整型来判重。。。

代码有点冗余尴尬。。。

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
bool vis1[10005];
bool vis2[10005];
char b[5];
inline int cal(char *a)
{
    int s=0;
    for(int i=0;i<4;i++)
    {
        s=s*10+a[i]-'0';
    }
    return s;
}
struct node{int dis;char a[5];};
void trans(node &x,int k,int kk)
{
    char tmp=x.a[k];
    x.a[k]=x.a[kk];
    x.a[kk]=tmp;
}
int bfs(char *a)
{
    if(strcmp(a,b)==0) return 0;

    node front1,front2,rear1,rear2;
    queue<node> q1;
    queue<node> q2;
    strcpy(front1.a,a);
    front1.dis=0;
    strcpy(front2.a,b);
    front2.dis=0;
    q1.push(front1);
    q2.push(front2);
    rear1=front1;
    rear2=front2;
    vis1[cal(a)]=1;
    vis2[cal(b)]=1;
    int k1=1,kk1=0,k2=1,kk2=0;
    while(!q1.empty()&&!q2.empty())
    {
        while(k1--)
        {
            front1=q1.front();q1.pop();
            for(int i=0;i<4;i++)
            {
            rear1=front1;
            if(rear1.a[i]=='9')
            {
                rear1.a[i]='1';
                rear1.dis=front1.dis+1;
                int x=cal(rear1.a);
                if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }

            }
            else
            {
                rear1.a[i]+=1;
                rear1.dis=front1.dis+1;
                int x=cal(rear1.a);
                if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }
            }
            }

            for(int i=0;i<4;i++)        //减1
            {
            rear1=front1;
            if(rear1.a[i]=='1')
            {
                rear1.a[i]='9';
                rear1.dis=front1.dis+1;
                int x=cal(rear1.a);
                if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }
            }
            else
            {
                rear1.a[i]-=1;
                rear1.dis=front1.dis+1;
                int x=cal(rear1.a);
                if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }
            }
        }
            for(int i=0;i<4;i++)        //交换
            {
            rear1=front1;
            if(i>0)
            {
                trans(rear1,i,i-1);
                rear1.dis=front1.dis+1;
                int x=cal(rear1.a);
                if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }
            }
            rear1=front1;
            if(i<3)
            {
               trans(rear1,i,i+1);
               rear1.dis=front1.dis+1;
               int x=cal(rear1.a);
               if(vis2[x]) return rear1.dis+front2.dis;
                if(!vis1[x])
                {
                    vis1[x]=1;
                    q1.push(rear1);
                    kk1++;
                }
            }
            }

        }
        k1=kk1,kk1=0;
        front1.dis++;
        while(k2--)
        {
            front2=q2.front();q2.pop();
            for(int i=0;i<4;i++)        //加1
            {
            rear2=front2;
            if(rear2.a[i]=='9')
            {
                rear2.a[i]='1';
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }

            }
            else
            {
                rear2.a[i]+=1;
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }
            }
            }

            for(int i=0;i<4;i++)        //减1
        {
            rear2=front2;
            if(rear2.a[i]=='1')
            {
                rear2.a[i]='9';
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }
            }
            else
            {
                rear2.a[i]-=1;
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }
            }
        }
        for(int i=0;i<4;i++)        //交换
        {
            rear2=front2;
            if(i>0)
            {
                trans(rear2,i,i-1);
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }
            }
            rear2=front2;
            if(i<3)
            {
                trans(rear2,i,i+1);
                rear2.dis=front2.dis+1;
                int x=cal(rear2.a);
                if(vis1[x]) return rear2.dis+front1.dis;
                if(!vis2[x])
                {
                    vis2[x]=1;
                    q2.push(rear2);
                    kk2++;
                }
            }
        }

        }
        k2=kk2,kk2=0;
        front2.dis++;
    }
}
int main()
{
    char a[5];
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        scanf("%s",a);
        scanf("%s",b);
        printf("%d\n",bfs(a));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TommyTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值