求调 WA on #5 #6 #7 #8
查看原帖
求调 WA on #5 #6 #7 #8
845400
lwj54joy楼主2025/1/16 21:59

WA on #5 #6 #7 #8

调了一天还没调出来,哪位大佬帮我看看

评测记录:https://www.luogu.com.cn/record/198579668

源代码:

#include <bits/stdc++.h>
using namespace std;

int t1[1010100][3], maxn = 100000;
//t1是存储状态的数组, t1[i][1]指第i个情况的魔板状态
//t1[i][0]指第i个情况的父亲的位置,
//t1[i][2]指第i个情况由哪个操作转换来的
int start = 12345678, endd; //分别对应初始状态和目标状态
int way[1010100];
//way: 输出结果时充当链表数组,存储父亲的位置
bool book[87654322];//判断两个状态是否重复了

void A(int j) { //A操作
	int tmp = 0;
	for (int i = 8; i >= 1; i--) {
		tmp += ((t1[j][1] % 10) * pow(10, i - 1));
		t1[j][1] /= 10;
	}
	t1[j][1] = tmp;
}


void B(int j) { //b操作
	t1[j][1] = (t1[j][1] % 100000 / 10000) * 10000000 + (t1[j][1] / 100000) * 10000 + t1[j][1] % 1000 * 10 + t1[j][1] % 10000 / 1000;
}


void C(int j) { //c操作
	t1[j][1] = t1[j][1] - ((t1[j][1] / 100000) % 100) * 100000 - (t1[j][1] % 1000) / 10 * 10 + t1[j][1] / 1000000 % 10 * 100000 + t1[j][1] / 100000 % 10 * 100 + t1[j][1] / 100 % 10 * 10 + t1[j][1] / 10 % 10 * 1000000;
}

bool chongfu(int n){//判重 
//	cout<<"Pending CF: "<<t1[n][1]<<endl;
	return book[t1[n][1]];//book数组类似桶排序数组
	//b[i] = true表示i在之前的队列中出现过 
}
bool found(int w){//判断是否达标 
	return t1[w][1] == endd;
}
void print(int zhuangtai){
	//打印函数,zhuangtai表示队列中的第zhuangtai种情况 
	if(zhuangtai == 1)	{//如果start == endd 
		printf("0");
		return ;
	}
	int k = 0,z = zhuangtai;
	while(z > 0){
		//逆推,将f[i][0]中类似链表的结构存储 
		way[++k] = z;//存储节点信息 
		z = t1[z][0];//访问此点的前一个来源 
	}
	printf("%d\n",k-1);//输出操作序列的长度
	for(int i = k-1;i >= 1;i--){
		//倒序输出操作序列,因为是倒着取出的(可以手画模拟下) 
		z = way[i];//导出节点(其实直接带入下句也行)
		printf("%c",t1[z][2]+'A'-1);
		//将情况z的【由什么操作来】的答案转化为字符并输出 
	} 
	return ; 
}
void starts(){//开始BFS 
	if(found(1)){
		//如果第一种状态(开始状态)等于目标状态 
		print(1);//调用打印函数 
		return ; 
	}
	int i = 1,j = 2; 
	while(i < j/*还有没探索到的状态*/ and j < maxn/*没有溢出*/){
//		cout<<i<<"--NEW--"<<j<<endl;
		for(int k = 1;k <= 3;k++){//A、B、C个不同的情况 
			t1[j][1] = t1[i][1];//预入队(还没有确定其没有出现过) 
			if(k == 1) A(j);//操作A 
			else if(k == 2) B(j);//操作B 
			else if(k == 3) C(j);//操作C
//			cout<<"Operator Completed.\n"; 
			if(!chongfu(j)){//如果这种状态没有重复过 
//				cout<<"Running Back...\n";
				t1[j][0] = i;//j的父亲是i
				t1[j][2] = k;//i进行了可行为k的操作得到j 
				if(found(j)){//如果达到了目标状态就输出 
					print(j);
					return ; 
				}else{
					book[t1[j][1]]+1;//标记这种状态已经出现过 
					j++;//队尾+1 
				}
			}
	//		cout<<"Base Completed.\n";
		} 
	//	cout<<"All Completed.\n";
		i++;//一种 
	}
}
int main() {
//	freopen("readin.txt","r",stdin);
//	freopen("checkout.txt","a",stdout);
//	cout<<"--------------------------------------"<<endl;
//	cout<<">>SYSTEM: TIME: "<<time(NULL)<<endl;
	for(int i = 8;i >= 1;i--){
		int x;
		scanf("%d",&x);
		endd += (x*pow(10,i-1));
	} 
	t1[1][1] = start;//标记初始状态 
	t1[1][0] = 0;//无父亲 
	starts();
}
2025/1/16 21:59
加载中...