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;
}
原文地址:https://www.cnblogs.com/huangriq/p/2447073.html