解题思路:对于这个问题来说,一共有三种操作,最终输出的结果又是最小的步骤 所以采用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分
4 人评分
C语言训练-求PI* (C语言代码)浏览:637 |
简单的for循环浏览:1495 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:580 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1483 |
陈教主的三角形 (C语言代码)浏览:1196 |
简单的a+b (C语言代码)浏览:683 |
生日日数 (C语言代码)浏览:1574 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:751 |
【计算球体积】 (C语言代码)浏览:1619 |
统计立方数 (C语言代码)浏览:890 |