http://poj.org/problem?id=1184
bfs 但是如果不加好的优化是过不了的 好像很多人多看了一分解析 我也是
很详细 下面是链接:
http://blog.youkuaiyun.com/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;
}