poj 1184 聪明的打字员

http://poj.org/problem?id=1184

bfs  但是如果不加好的优化是过不了的 好像很多人多看了一分解析 我也是

很详细 下面是链接:

http://blog.csdn.net/lyy289065406/article/details/6648695

非常不错的解题报告

我的代码 很丑:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<string>

#include<vector>

#include<set>

#include<queue>

#include<stack>

#include<cmath>

#define LL long long



using namespace std;



const int N=1000005;

const int MAX=0x3f3f3f3f;

bool visited[7][1000][100];

int num[1000][100];

int f[700000];

int real[1000];

struct node

{

    int x,y,z,k;

}que[N];

int I,J;

int a[7];

int b[7];

int c[7];

bool had[7];

int st,nd;

void dfs(int l,int sum)

{

    if(l==7)

    {

        real[I]=sum;

        f[sum]=I++;

        return ;

    }

    for(int i=1;i<=6;++i)

    {

        if(!had[i])

        {

            had[i]=true;

            dfs(l+1,sum*10+i);

            had[i]=false;

        }

    }

}

int k1,k2;

void swap1(int x,int y,int z,int k)

{

    k1=y/a[x]%10;

    k2=y/100000;

    y=y-(k1*a[x]-k2*a[x])-(k2-k1)*100000;

    if(visited[x][f[y]][k]==true)

    return ;

    visited[x][f[y]][k]=true;

    num[f[y]][k]=min(num[f[y]][k],z+1);

    que[J].x=x;que[J].y=y;que[J].z=z+1;que[J].k=k;++J;

}

void swap6(int x,int y,int z,int k)

{

    k1=y/a[x]%10;

    k2=y%10;

    y=y-(k1*a[x]-k2*a[x])-(k2-k1);

    k=k|(1<<5);//cout<<x<<" "<<y<<" "<<z<<" "<<k<<endl;

    if(visited[x][f[y]][k]==true)

    return ;

    visited[x][f[y]][k]=true;

    num[f[y]][k]=min(num[f[y]][k],z+1);

    que[J].x=x;que[J].y=y;que[J].z=z+1;que[J].k=k;++J;

}

void cur_left(int x,int y,int z,int k)

{

    --x;

    if(visited[x][f[y]][k]==true)

    return ;

    visited[x][f[y]][k]=true;

    num[f[y]][k]=min(num[f[y]][k],z+1);

    que[J].x=x;que[J].y=y;que[J].z=z+1;que[J].k=k;++J;

}

void cur_right(int x,int y,int z,int k)

{

    k=k|(1<<x);

    ++x;

    if(visited[x][f[y]][k]==true)

    return ;

    visited[x][f[y]][k]=true;

    num[f[y]][k]=min(num[f[y]][k],z+1);

    que[J].x=x;que[J].y=y;que[J].z=z+1;que[J].k=k;++J;

}

void bfs()

{

    int x,y,z,k;

    while(I<J)

    {

        x=que[I].x;y=que[I].y;

        z=que[I].z;k=que[I].k;++I;

        if(x>1)

        swap1(x,y,z,k);

        if(x<6)

        swap6(x,y,z,k);

        if(x>1)

        cur_left(x,y,z,k);

        if(x<6)

        cur_right(x,y,z,k);

    }

}

void begin()

{

    a[6]=1;

    for(int i=5;i>=1;--i)

    a[i]=a[i+1]*10;

    memset(had,false,sizeof(had));

    I=0;

    dfs(1,0);

    I=J=0;

    for(int i=0;i<720;++i)

    for(int j=0;j<64;++j)

    num[i][j]=MAX;

    memset(visited,false,sizeof(visited));

    int s=123456;

    visited[1][f[s]][1]=true;

    num[f[s]][1]=0;

    que[J].x=1;que[J].y=s;que[J].z=0;que[J].k=1;++J;

    bfs();

}

int Fmin(int i,int j)

{

    int temp=nd;

    for(int l=6;l>=1;--l)

    {

        c[l]=b[i%10];

        a[l]=temp%10;

        i=i/10;temp=temp/10;

    }

    int k=0;

    for(int l=1;l<=6;++l)

    {

        if(a[l]!=c[l])

        {

            if((j&1)==0)

            return MAX;

            k+=abs(a[l]-c[l]);

        }

        j=j>>1;

    }

    return k;

}

int main()

{

   //freopen("data","r",stdin);

    begin();

    while(scanf("%d %d",&st,&nd)!=EOF)

    {

        int ans=MAX;

        for(int i=6;i>=1;--i)

        {

            b[i]=st%10;

            st=st/10;

        }

        for(int i=0;i<720;++i)

        {

            for(int j=0;j<64;++j)

            {

                if(num[i][j]!=MAX)

                {

                    ans=min(ans,num[i][j]+Fmin(real[i],j));

                }

            }

        }

        printf("%d\n",ans);

    }

    return 0;

}

  

你可能感兴趣的:(poj)