zoukankan      html  css  js  c++  java
  • 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;
    }
    
    


  • 相关阅读:
    django之ORM的查询优化、Ajax 06
    django 模型层(orm)05
    制作第三方SDK静态库、.framework(修正)
    iOS与HTML5交互方法总结(修正)
    进程间的几种通信方式
    CocoaPods容易出现的问题;
    2016 Mac OS 10.11 CocoaPods的安装问题
    HTML5要点_CSS(三)
    HTML5要点(二)
    HTML5要点(一)
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254391.html
Copyright © 2011-2022 走看看