zoukankan      html  css  js  c++  java
  • poj 1184(聪明的打字员)

    View Code
    #include<iostream>
    #include<queue>
    #include<cmath>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    struct node{
        int w,deep,pos,flag;
    };
    int pow(int a,int b)
    {
        if(b==0)return 1;
        if(b%2==1)return a*pow(a*a,b/2);
        else return pow(a*a,b/2);
    }
    int min0;
    bool b[1000001][7][2]={false};
    int flag[4]={1,6,0,0};
    int move[4]={0,0,1,-1};
    int swap(int u,int pos1,int pos2)
    {
        int temp=u,p1,p2;
        int t1=pow(10,6-pos1);
        int t2=pow(10,6-pos2);
        p1=(u/t1)%10;
        p2=(u/t2)%10;
        return temp+(t2-t1)*p1+(t1-t2)*p2;
    }
    int getDict(int s,int t,int pos,int flag)
    {
        if(s==t)return 0;
        int sum,mx,mi,t6;
        t6=sum=0;
        mx=mi=pos;
        for(int i=6;i>=1;i--)
        {
            int t0=abs(s%10-t%10);
            s/=10;
            t/=10;
            if(t0)
            {
                sum+=t0;
                if(i==6){t6=1;continue;}
                if(i>mx)mx=i;
                if(i<mi)mi=i;
            }
        }
        if(flag||!t6) return sum+mx-pos;
        else return min(sum+mx-pos+2,sum+6-pos);
    }
    void bfs(int s,int t)
    {
        queue<node> q1;
        node in;
        in.w=s;
        in.deep=0;
        in.pos=1;
        in.flag=0;
        q1.push(in);
        b[s][1][0]=true;
        min0=min(min0,getDict(s,t,1,0));
        while(!q1.empty())
        {
            node out=q1.front();
            q1.pop();
            if(out.deep>=min0)return ;
            for(int i=0;i<4;i++)
            {
                int w=out.w;
                int pos=out.pos;
                in.flag=out.flag;
                if(flag[i]!=0)
                {
                    w=swap(w,pos,flag[i]);
                    if(flag[i]==6)in.flag=1;
                }
                in.pos=pos+move[i];
                if(in.pos<1||in.pos>6)continue;
                if(b[w][in.pos][in.flag])continue;
                b[w][in.pos][in.flag]=true;
                in.deep=out.deep+1;
                min0=min(min0,getDict(w,t,pos,in.flag)+in.deep);
                in.w=w;
                q1.push(in);
            }
        }
    }
    int main()
    {
        int s,t;
        scanf("%d%d",&s,&t);
        min0=0x7ffffff;
        if(s==t){printf("0\n");return 0;}
        bfs(s,t);
        printf("%d\n",min0);
        return 0;
    }
  • 相关阅读:
    HDOJ1267 下沙的沙子2[DP或卡特兰数]
    HDOJ1711 Number Sequence[KMP模版]
    HDOJ2546 饭卡[DP01背包问题]
    寻找必败态——一类博弈问题的快速解法
    kmp 模版
    网络流题目
    HDOJ1261 字串数[组合+大数]
    传说中效率最高的最大流算法(Dinic) [转]
    ACM博弈论
    HDOJ1061 Rightmost Digit[简单数学题]
  • 原文地址:https://www.cnblogs.com/huangriq/p/2447073.html
Copyright © 2011-2022 走看看