调了一天还没调出来,哪位大佬帮我看看
评测记录: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();
}