前四个点AC了
本地跑RE
洛谷ide跑不输出
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int mb[9]={0,1,2,3,4,5,6,7,8};
unsigned long long head=0;//队列头
unsigned long long tail=1;//队列尾
int dl[300001]={};//队列
int lon[300001]={};//队列对应的变换
int zhiz[300001]={};//链表队列,指向上一个
int last[200001]={};//保存输出
bool check(int num)//检测是否和目标一样
{
if(num%3!=1)
return 0;
int a[9]={};
a[1]=dl[num]/10000000;
a[2]=dl[num]/1000000%10;
a[3]=dl[num]/100000%10;
a[4]=dl[num]/10000%10;
a[5]=dl[num]/1000%10;
a[6]=dl[num]/100%10;
a[7]=dl[num]/10%10;
a[8]=dl[num]/1%10;
bool flag=1;
for(int i=1;i<=8;i++)
{
if(a[i]!=mb[i])
{
flag=0;
break;
}
}
return flag;
}
void acz(int num,int end)//模拟A
{
int a1,a2,a3,a4,a5,a6,a7,a8;
a1=dl[num]/10000000;
a2=dl[num]/1000000%10;
a3=dl[num]/100000%10;
a4=dl[num]/10000%10;
a5=dl[num]/1000%10;
a6=dl[num]/100%10;
a7=dl[num]/10%10;
a8=dl[num]/1%10;
int zz=0;
zz=a1;
a1=a8;
a8=zz;
zz=a2;
a2=a7;
a7=zz;
zz=a3;
a3=a6;
a6=zz;
zz=a4;
a4=a5;
a5=zz;
dl[end]=a1*10000000+a2*1000000+a3*100000+a4*10000+a5*1000+a6*100+a7*10+a8;
}
void bcz(int num,int end)//模拟B
{
int a1,a2,a3,a4,a5,a6,a7,a8;
a1=dl[num]/10000000;
a2=dl[num]/1000000%10;
a3=dl[num]/100000%10;
a4=dl[num]/10000%10;
a5=dl[num]/1000%10;
a6=dl[num]/100%10;
a7=dl[num]/10%10;
a8=dl[num]/1%10;
int zz=a1;
a1=a4;
a4=a3;
a3=a2;
a2=zz;
zz=a8;
a8=a5;
a5=a6;
a6=a7;
a7=zz;
dl[end]=a1*10000000+a2*1000000+a3*100000+a4*10000+a5*1000+a6*100+a7*10+a8;
}
void ccz(int num,int end)//模拟C
{
int a1,a2,a3,a4,a5,a6,a7,a8;
a1=dl[num]/10000000;
a2=dl[num]/1000000%10;
a3=dl[num]/100000%10;
a4=dl[num]/10000%10;
a5=dl[num]/1000%10;
a6=dl[num]/100%10;
a7=dl[num]/10%10;
a8=dl[num]/1%10;
int zz=a2;
a2=a7;
a7=a6;
a6=a3;
a3=zz;
dl[end]=a1*10000000+a2*1000000+a3*100000+a4*10000+a5*1000+a6*100+a7*10+a8;
}
void bfs()
{
if(head==32502)//这是本地跑RE时的队列头,用于检测(可是我没检测明白)第5个点
{
int lk;
lk++;
}
if(head==100000)//循环队列
head=1;
if(tail==100000)
tail=1;
if(check(head))//输出答案
{
int p=1;
int sh=head;
while(zhiz[sh]!=0)
{
last[p]=lon[zhiz[sh]];
sh=zhiz[sh];
p++;
}
printf("%d\n",p-1);
for(int i=p-1;i>=1;i--)
{
printf("%c",'A'-1+last[i]);
}
exit(0);
}
head++;
if(lon[head]==1)//暴搜
{
acz(head,tail);
lon[tail]=1;
zhiz[tail]=head;
tail++;
acz(head,tail);
lon[tail]=2;
zhiz[tail]=head;
tail++;
acz(head,tail);
lon[tail]=3;
zhiz[tail]=head;
tail++;
bfs();
}
if(lon[head]==2)
{
bcz(head,tail);
lon[tail]=1;
zhiz[tail]=head;
tail++;
bcz(head,tail);
lon[tail]=2;
zhiz[tail]=head;
tail++;
bcz(head,tail);
lon[tail]=3;
zhiz[tail]=head;
tail++;
bfs();
}
if(lon[head]==3)
{
ccz(head,tail);
lon[tail]=1;
zhiz[tail]=head;
tail++;
ccz(head,tail);
lon[tail]=2;
zhiz[tail]=head;
tail++;
ccz(head,tail);
lon[tail]=3;
zhiz[tail]=head;
tail++;
bfs();
}
}
int main()
{
for(int i=1;i<=8;i++)
{
scanf("%d",&mb[i]);
}
dl[1]=dl[2]=dl[3]=12345678;//初始化
lon[1]=1;
lon[2]=2;
lon[3]=3;
head=0;
tail=4;
bfs();
return 0;
}
第五个点(不输出)数据:
6 1 5 4 3 2 7 8
14
ABBBCABBBCBBBC
。。。。。。
没用(不会)康托展开,感觉循环队列也可以A
谢谢!