Идея: поиск наименьшего операнда. Мы обнаружили, что для каждой операции есть 4 варианта. Дерево поиска будет очень глубоким, поэтому ищите по операнду и используйте IDA *. Из вопроса мы видим, что этот ввод и соответствующий нижний индекс выглядят так:
Выполнив 8 операций, мы можем обнаружить, что он изменит положение только одного числа за операцию. Давайте выясним, какое из 8 средних чисел чаще всего появляется как res, тогда наш наименее и самый важный операнд - 8-res, пусть он как оценочная функция. Поскольку требуется наименьший операнд, обратная операция, такая как сначала A, а затем F, эквивалентна отсутствию изменений, поэтому мы записываем обратную операцию, соответствующую каждой операции. Нижний индекс соответствует 0 (A), а обратная операция - 5 (F). Чтобы облегчить перемещение чисел, мы сначала пишем нижние индексы, которые будут изменены в соответствии с 8 операциями.
#pragma GCC optimize(2)#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root<<1#define rson root<<1|1typedef pair<int,int> PII;typedef pair<int,PII> PIII;constint mod=1e9+7;constint N=2e5+5;constint inf=0x7f7f7f7f;intgcd(int a,int b){
return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){
return a*(b/gcd(a,b));}template<classT>voidread(T &x){
char c;bool op =0;while(c =getchar(), c <'0'|| c >'9')if(c =='-')
op =1;
x = c -'0';while(c =getchar(), c >='0'&& c <='9')
x = x *10+ c -'0';if(op)
x =-x;}template<classT>voidwrite(T x){
if(x <0)
x =-x,putchar('-');if(x >=10)write(x /10);putchar('0'+ x %10);}
ll qsm(int a,int b,int p){
ll res=1%p;while(b){
if(b&1)
res=res*a%p;
a=1ll*a*a%p;
b>>=1;}return res;}int mp[8][7]={
{
0,2,6,11,15,20,22},{
1,3,8,12,17,21,23},{
10,9,8,7,6,5,4},{
19,18,17,16,15,14,13},{
23,21,17,12,8,3,1},{
22,20,15,11,6,2,0},{
13,14,15,16,17,18,19},{
4,5,6,7,8,9,10}};//操作对应修改的地方int opposite[8]={
5,4,7,6,1,0,3,2};//对应的逆操作int center[8]={
6,7,8,12,17,16,15,11};//中间8个数int a[100],path[100];intf(){
int sum[4]={
0};for(int i=0;i<8;i++) sum[a[center[i]]]++;int res=0;for(int i=1;i<=3;i++){
res=max(res,sum[i]);}return8-res;}voidmove(int x){
int t=a[mp[x][0]];for(int i=0;i<6;i++) a[mp[x][i]]=a[mp[x][i+1]];
a[mp[x][6]]=t;}booldfs(int u,int mxdep,int last){
if(u+f()>mxdep)returnfalse;if(f()==0)returntrue;for(int i=0;i<8;i++){
if(opposite[i]!=last){
move(i);
path[u]=i;if(dfs(u+1,mxdep,i))returntrue;move(opposite[i]);}}returnfalse;}intmain(){
while(cin>>a[0],a[0]){
for(int i=1;i<24;i++)cin>>a[i];int dep=0;while(!dfs(0,dep,-1))dep++;if(!dep)printf("No moves needed");else{
for(int i=0;i<dep;i++)printf("%c",path[i]+'A');}printf("\n%d\n",a[6]);}return0;}