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;
}

  

posted on 2012-08-22 14:25  夜->  阅读(258)  评论(0编辑  收藏  举报