/* 这个题要想清楚是用dfs还是bfs,dfs可能会得出不正确结果,例如AAAB 所以用队列实现bfs Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 魔板由8个大小相同方块组成,分别用涂上不同颜色,用1到8的数字表示。 其初始状态是 1 2 3 4 8 7 6 5 对魔板可进行三种基本操作: A操作(上下行互换): 8 7 6 5 1 2 3 4 B操作(每次以行循环右移一个): 4 1 2 3 5 8 7 6 C操作(中间四小块顺时针转一格): 1 7 2 4 8 6 3 5 用上述三种基本操作,可将任一种状态装换成另一种状态。 Input 输入包括多个要求解的魔板,每个魔板用三行描述。 第一行步数N(不超过10的整数),表示最多容许的步数。 第二、第三行表示目标状态,按照魔板的形状,颜色用1到8的表示。 当N等于-1的时候,表示输入结束。 Output 对于每一个要求解的魔板,输出一行。 首先是一个整数M,表示你找到解答所需要的步数。接着若干个空格之后,从第一步开始按顺序给出M步操作(每一步是A、B或C),相邻两个操作之间没有任何空格。 注意:如果不能达到,则M输出-1即可。 Sample Input 4 5 8 7 6 4 1 2 3 3 8 7 6 5 1 2 3 4 -1 Sample Output 2 AB 1 A */ #include<iostream> #include <iomanip> #include<stdio.h> #include<cmath> #include<iomanip> #include<list> #include <map> #include <vector> #include <string> #include <algorithm> #include <sstream> #include <stack> #include<queue> #include<string.h> #include<set> using namespace std; int N; int initdata[2][4]={{1,2,3,4},{8,7,6,5}}; int goal[2][4]; bool equal(int data[][4]) { for(int i=0;i<2;i++) { for(int j=0;j<4;j++) { if(data[i][j]!=goal[i][j]) return false; } } return true; } typedef struct STATUS { vector<char> oper; int deep; int data[2][4]; }Status; int main() { while(cin>>N&&N!=-1) { for(int i=0;i<8;i++) cin>>goal[i/4][i%4]; queue<Status> qu;//表示深度 Status st; st.deep=N; memcpy(st.data,initdata,sizeof(initdata)); qu.push(st); bool flag=false; while(!qu.empty()) { Status to=qu.front(); qu.pop(); if(equal(to.data)) { cout<<to.oper.size()<<" "; for(int i=0;i<to.oper.size();i++) cout<<to.oper[i]; cout<<endl; flag=true; break; } if(to.deep==0) continue; Status op; op.deep=to.deep-1; memcpy(op.data,to.data,sizeof(initdata)); for(int i=0;i<4;i++)//A操作 swap(op.data[0][i],op.data[1][i]); op.oper=to.oper; op.oper.push_back('A'); qu.push(op); memcpy(op.data,to.data,sizeof(initdata)); for(int i=0;i<2;i++)//B操作 { int tmp=op.data[i][3]; for(int j=3;j>0;j--) { op.data[i][j]=op.data[i][j-1]; } op.data[i][0]=tmp; } op.oper=to.oper; op.oper.push_back('B'); qu.push(op); memcpy(op.data,to.data,sizeof(initdata)); int tmp=op.data[0][1]; op.data[0][1]=op.data[1][1]; op.data[1][1]=op.data[1][2]; op.data[1][2]=op.data[0][2]; op.data[0][2]=tmp; op.oper=to.oper; op.oper.push_back('C'); qu.push(op); } if(flag==false) cout<<-1<<endl; } }