解题思路:





注意事项:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
typedef struct node {
    int data;
    int d[10];
    int len;
    int road[100];
}node;
const int maxn = 10000;
int  A[10] ,B[10];
int hase(int *d){
     int sum=0;
     for(int i=1;i<=8;i++)
     sum=sum*10+d[i];
     return sum ;
}
int fa(int *t){
    return hase(t)/10000+hase(t)%10000*10000;
}
int fb(int *t){
    int a[10];
    a[1]=t[2];a[2]=t[3];a[3]=t[4];a[4]=t[1];
    a[5]=t[6];a[6]=t[7];a[7]=t[8];a[8]=t[5];
    return hase(a);
}
int fc(int *t){
      int a[10];
      a[1]=t[1];a[4]=t[4];a[5]=t[5];a[8]=t[8];
      a[2]=t[6];a[3]=t[2];a[6]=t[7];a[7]=t[3];
      return hase(a);
}
int main(void){
    int T;
    cin >> T;
    while(T--){
        for(int i=1;i<=4;i++) scanf("%1d",&A[i]);
        for(int i=1;i<=4;i++) scanf("%1d",&A[9-i]);
        for(int i=1;i<=4;i++) scanf("%1d",&B[i]);
        for(int i=1;i<=4;i++) scanf("%1d",&B[9-i]);
        queue<node>q;
        set<int>s;
        node a ;
        for(int i=1;i<=8;i++) a.d[i]=A[i];
        a.data = hase(A);
        a.len = 0 ;
        q.push(a);
        s.insert(a.data);
        int b_hash=hase(B);
        while(!q.empty()){
            node  x = q.front(); q.pop();
            if(x.data == b_hash){
                for(int i=0;i<x.len;i++) printf("%c",'A'+x.road[i]);
                printf("\n");
                break;
            }
            int t[10],base=10000000;
            for(int i=1;i<=8;i++){ t[i]=x.data/base%10; base /=10;}
            int a=fa(t),b =fb(t),c=fc(t);
            if(s.count(a)==0) {
                    s.insert(a);
                    node y;
                    y.data=a;
                    y.len=x.len+1;
                    memcpy(y.road,x.road,sizeof(y.road));
                    y.road[x.len]=0;
                    q.push(y);
            }
            if(s.count(b)==0) {
                    s.insert(b);
                    node y;
                    y.data=b;
                    y.len=x.len+1;
                    memcpy(y.road,x.road,sizeof(y.road));
                    y.road[x.len]=1;
                    q.push(y);
            }
            if(s.count(c)==0)  {
                    s.insert(c);
                    node y;
                    y.data=c;
                    y.len=x.len+1;
                    memcpy(y.road,x.road,sizeof(y.road));
                    y.road[x.len]=2;
                    q.push(y);
            }
        }
    }
    return 0;
}










#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef struct node {
    int data;
    int len;
    int road[100];
}node;
int s[87654321] ;
node q[1000000];
const int maxn = 10000;
int  A[10] ,B[10];
int hase(int *d){
     int sum=0;
     for(int i=1;i<=8;i++)
     sum=sum*10+d[i];
     return sum ;
}
int fa(int *t){
    return hase(t)/10000+hase(t)%10000*10000;
}
int fb(int *t){
    int a[10];
    a[1]=t[2];a[2]=t[3];a[3]=t[4];a[4]=t[1];
    a[5]=t[6];a[6]=t[7];a[7]=t[8];a[8]=t[5];
    return hase(a);
}
int fc(int *t){
      int a[10];
      a[1]=t[1];a[4]=t[4];a[5]=t[5];a[8]=t[8];
      a[2]=t[6];a[3]=t[2];a[6]=t[7];a[7]=t[3];
      return hase(a);
}
int main(void){
    int T;
    cin >> T;
    while(T--){
        memset(s,0,sizeof(s));
        for(int i=1;i<=4;i++) scanf("%1d",&A[i]);
        for(int i=1;i<=4;i++) scanf("%1d",&A[9-i]);
        for(int i=1;i<=4;i++) scanf("%1d",&B[i]);
        for(int i=1;i<=4;i++) scanf("%1d",&B[9-i]);

        node a ;
        a.data = hase(A);
        a.len = 0 ;
        q[1]=a;
        s[a.data]=1;
        int b_hash=hase(B);
        int rear=1,bottom=2;
        while(rear<bottom){
            node  x = q[rear]; rear++;
            if(x.data == b_hash){
                for(int i=0;i<x.len;i++) printf("%c",'A'+x.road[i]);
                printf("\n");
                break;
            }
            int t[10],base=10000000;
            for(int i=1;i<=8;i++){ t[i]=x.data/base%10; base /=10;}
            int a=fa(t),b =fb(t),c=fc(t);
            if(s[a]==0) {
                    s[a]=1;
                    node y=x;
                    y.data=a;
                    y.len=x.len+1;
                    y.road[x.len]=0;
                    q[bottom++]=y;
            }
            if(s[b]==0) {
                    s[b]=1;
                    node y=x;
                    y.data=b;
                    y.len=x.len+1;
                    y.road[x.len]=1;
                    q[bottom++]=y;
            }
            if(s[c]==0)  {
                    s[c]=1;
                    node y=x;
                    y.data=c;
                    y.len=x.len+1;
                    y.road[x.len]=2;
                    q[bottom++]=y;
            }
        }
    }
    return 0;
}





参考代码:

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

lalalala 7年前 回复TA
哥们,相信你也知道循环很占时间的,又是while又是for,要我是计算机也会爆掉!!!!!