求助,后四个点不输出了
查看原帖
求助,后四个点不输出了
445049
Winkle楼主2021/9/21 23:21

前四个点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

谢谢!

2021/9/21 23:21
加载中...