传送门
直接大力广搜出奇迹。
不需要任何优化
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
int a[10],b[10],q[100005];
int x,y;
int cal(int *a){
int s=0;
for (int i=0;i<8;i++)
s=s*10+a[i];
return s;
}
void get(int x,int *a){
for (int i=7;i>=0;i--)
a[i]=x%10,x/=10;
}
int main(){
for (int i=0;i<8;i++)
scanf("%d",&a[i]);
x=cal(a); mp[x]=1;
int h=0,t=1; q[1]=x;
while (h!=t){
x=q[++h]; get(x,a);
memcpy(b,a,sizeof(b));
for (int i=0;i<4;i++) swap(b[i],b[7-i]);
y=cal(b);
if (!mp[y]) mp[y]=mp[x]+1,q[++t]=y;
for (int i=0;i<4;i++)
b[(i+3)%4]=a[i],b[(i+1)%4+4]=a[i+4];
y=cal(b);
if (!mp[y]) mp[y]=mp[x]+1,q[++t]=y;
memcpy(b,a,sizeof(b));
swap(b[2],b[5]); swap(b[5],b[6]); swap(b[6],b[1]);
y=cal(b);
if (!mp[y]) mp[y]=mp[x]+1,q[++t]=y;
}
for (int i=0;i<8;i++) a[i]=i+1;
printf("%d",mp[cal(a)]-1);
}