原题链接:魔板
解题思路:对于这个问题来说,一共有三种操作,最终输出的结果又是最小的步骤 所以采用bfs进行暴力破解
题目是多组数据进行输入,所以用while循环进行输入,接下来基本上就是套用bfs暴力破解的魔板直接进行求解
中间涉及到判重问题,因为涉及的数据不是很大8**8 = 16777216所以使用set集合来判重,(也可以使用hash数组进行判重)在本次结束之后,清空set queue开始的时候也是使用全局变量的 但是因为queue在STL库中并没有对应的直接清空函数,所以直接将queue当做参数进行传递用c++独特的引用传递方式
#include <bits/stdc++.h>
using namespace std;
string s1, s2; //初始状态 目标状态
string tmp; //临时字符串
struct node{ //
string str;
string step;
};
node p, Next;
set<string> ss;
void change(node st, int sum, queue<node> &q){
//A类型的变换,上下变换
if(0 == sum){
for(int i = 0; i <= 3; i++){
char temp = st.str.at(i);
st.str.at(i) = st.str.at(7-i);
st.str.at(7-i) = temp;
}
st.step += "A";
//cout << st.str << endl;
//cout << st.step << endl;
if(ss.count(st.str) == 0){
ss.insert(st.str);
q.push(st);
}
}else if(1 == sum){
//B类型的变换 右移变换
char temp = st.str.at(3);
for(int i = 3; i > 0; i--){
st.str.at(i) = st.str.at(i-1);
}
st.str.at(0) = temp;
temp = st.str.at(4);
for(int i = 4; i < 7; i++){
st.str.at(i) = st.str.at(i+1);
}
st.str.at(7) = temp;
st.step += "B";
//cout << st.str << endl;
//cout << st.step << endl;
if(ss.count(st.str) == 0){
ss.insert(st.str);
q.push(st);
}
}else if(2 == sum){
//C类型的变换, 顺时针变换
char temp = st.str.at(1);
st.str.at(1) = st.str.at(6);
st.str.at(6) = st.str.at(5);
st.str.at(5) = st.str.at(2);
st.str.at(2) = temp;
st.step += "C";
//cout << st.str << endl;
//cout << st.step << endl;
if(ss.count(st.str) == 0){
ss.insert(st.str);
q.push(st);
}
}
//
}
int main(){
while(cin >> s1 >> s2){
queue<node>q; //开始的时候是定义的全局变量 因为STL库中没有对应的直接清空queue的方法,
ss.insert(s1); //所以将其用c++中特有的引用传递关于这个问题有时间专门写一个关于这方面的感悟
p.str = s1;
p.step = "";
q.push(p); //入队列
while(!q.empty()){
Next = q.front();//取队首元素
q.pop(); //队首元素出队
if(Next.str.compare(s2) == 0){//找到了目标字符串,则输出路径
cout << Next.step << endl;
break;
}
for(int i = 0; i < 3; i++){
change(Next, i, q);
//getchar();
}
}
ss.clear(); //清空set
}
return 0;
}
注意事项:
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复