• HDU 1195


    HDU 1195

    双端BFS

    /*************************************************************************
    	> File Name: 2.cpp
    	> Author:yuan
    	> Mail:
    	> Created Time: 2014年11月25日 星期二 23时33分09秒
    ***********************************************************************/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct node
    {
        int mat[4];
        int sum;
    };
    int ans;
    node q1[10005],q2[10005];
    int t;
    int top1,top2,base1,base2;
    int vis1[10005],vis2[10005];
    void copy1(node &s1,node s2)
    {
        for(int i=0;i<4;i++)
        {
            s1.mat[i]=s2.mat[i];
        }
    }
    bool check1(node n1)
    {
        int num=0;
        num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
        if(vis1[num]) return 0;
        else return 1;
    }
    bool check2(node n2)
    {
        int num=0;
        num=n2.mat[0]*1000+n2.mat[1]*100+n2.mat[2]*10+n2.mat[3];
        if(vis2[num]) return 0;
        else return 1;
    }
    void BFS()
    {
        node n1;int ll=1;
        while(base1<top1||base2<top2)
        {
            int ans1;
         if(base1<top1){
          for(int i=0;i<7;i++)
            {
                if(i<4){
                    copy1(n1,q1[base1]);
                    if(n1.mat[i]==9) n1.mat[i]=1;
                    else n1.mat[i]+=1;
                    if(check1(n1)){
                     copy1(q1[top1],n1);
                     q1[top1].sum=q1[base1].sum+1;
                     top1++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis1[num]=top1-1;
                     if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);}
                    }
                    copy1(n1,q1[base1]);
                    if(n1.mat[i]==1) n1.mat[i]=9;
                    else n1.mat[i]-=1;
                    if(check1(n1)){
                     copy1(q1[top1],n1);
                     q1[top1].sum=q1[base1].sum+1;
                     top1++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis1[num]=top1-1;
                     if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);}
                    }
                }
                else
                {
                   int k=i-4;
                    copy1(n1,q1[base1]);
                   int d=n1.mat[k];
                   n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d;
                    if(check1(n1)){
                     copy1(q1[top1],n1);
                     q1[top1].sum=q1[base1].sum+1;
                     top1++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis1[num]=top1-1;
                     if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans1,ans);}
                    }
                }
            }
            base1++;
        }
         if(base2<top2){
              for(int i=0;i<7;i++)
            {
                if(i<4){
                    copy1(n1,q2[base2]);
                    if(n1.mat[i]==9) n1.mat[i]=1;
                    else n1.mat[i]+=1;
                    if(check2(n1)){
                     copy1(q2[top2],n1);
                     q2[top2].sum=q2[base2].sum+1;
                     top2++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis2[num]=top2-1;
                     if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);}
                    }
                    copy1(n1,q2[base2]);
                    if(n1.mat[i]==1) n1.mat[i]=9;
                    else n1.mat[i]-=1;
                    if(check2(n1)){
                     copy1(q2[top2],n1);
                     q2[top2].sum=q2[base2].sum+1;
                     top2++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis2[num]=top2-1;
                     if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);}
                    }
                }
                else
                {
                   int k=i-4;
                    copy1(n1,q2[base2]);
                   int d=n1.mat[k];n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d;
                    if(check2(n1)){
                     copy1(q2[top2],n1);
                     q2[top2].sum=q2[base2].sum+1;
                     top2++;
                     int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
                     vis2[num]=top2-1;
                     if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans1,ans);}
                    }
                }
            }
            base2++;
         }
      }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            ans=0x3ffffff;
            char str1[5],str2[5];
            node q11,q22;
            scanf("%s",str1);scanf("%s",str2);
            for(int i=0;i<4;i++)
            {
               q11.mat[i]=str1[i]-'0';
               q22.mat[i]=str2[i]-'0';
            }
            top1=top2=base1=base2=1;
            memset(q1,0,sizeof(q1));
            memset(q2,0,sizeof(q2));
            memset(vis1,0,sizeof(vis1));
            memset(vis2,0,sizeof(vis2));
            copy1(q1[1],q11);
            copy1(q2[1],q22);
            top1++;top2++;
            BFS();
            printf("%d
    ",ans);
            char nnn[10];
            gets(nnn);
        }
       return 0;
    }
    
    


  • 相关阅读:
    Android Watchdog
    Android Zygote进程是如何fork一个APP进程的
    java多线程面试题小结
    Java Socket通信以及可能出现的问题解决
    Java对象的浅拷贝和深拷贝&&String类型的赋值
    AtomicLong和LongAdder的区别
    JDK中Concurrent包介绍及使用(包含atomic包/lock包/并发容器/执行器)
    final关键字总结
    Java内存模型-final域的内存语义--没明白,预留以后继续理解
    synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254391.html
Copyright © 2020-2023  润新知