思路:预处理12345能到达所有情况的最小步数即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#define INF 0x3f3f3f3f
#define esp 1e-9
typedef long long LL;
using namespace std;
const int maxn = 100000;
int ans[maxn][5][5];
struct Node
{
int s[10];
int op2,op3;
int step;
};
int change(Node a)
{
int sum = 0;
for(int i = 1;i<=5;i++)
{
sum+=a.s[i];
sum*=10;
}
return sum/10;
}
void bfs(Node st)
{
memset(ans,INF,sizeof(ans));
int n = change(st);
queue<Node>q;
st.op2 = 3; //jia 1
st.op3 = 2; // *2
st.step = 0;
q.push(st);
ans[n][st.op2][st.op3]=0;
// printf("%d\n",ans[n][st.op2][st.op3]);
while(!q.empty())
{
Node u = q.front();
q.pop();
for(int i = 2;i<=5;i++)
{
Node tmpu = u;
swap(tmpu.s[i],tmpu.s[i-1]);
int t = change(tmpu);
tmpu.step++;
if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;
q.push(tmpu);
ans[t][tmpu.op2][tmpu.op3]=tmpu.step;
}
if(u.op2>0)
{
for(int i = 1;i<=5;i++)
{
Node tmpu = u;
tmpu.op2--;
tmpu.s[i] =(tmpu.s[i]+1)%10;
int t = change(tmpu);
tmpu.step++;
if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;
q.push(tmpu);
ans[t][tmpu.op2][tmpu.op3] = tmpu.step;
}
}
if(u.op3>0)
{
for(int i = 1;i<=5;i++)
{
Node tmpu = u;
tmpu.op3--;
tmpu.step++;
tmpu.s[i] = (tmpu.s[i]*2)%10;
int t = change(tmpu);
if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;
q.push(tmpu);
ans[t][tmpu.op2][tmpu.op3]=tmpu.step;
}
}
}
// printf("%d\n",ans[12345][3][2]);
}
char s[10];
Node tar;
int main()
{
for(int i = 1;i<=5;i++)tar.s[i]=i;
bfs(tar);
while(scanf("%s",s+1)!=EOF)
{
int anss = INF;
Node a;
for(int i = 1;i<=5;i++)a.s[i]=s[i]-'0';
int ta = change(a);
for(int i = 0;i<=3;i++)
for(int j = 0;j<=2;j++)
anss = min(anss,ans[ta][i][j]);
if(anss==INF)printf("-1\n");
else printf("%d\n",anss);
}
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
return 0;
}