ice


私信TA

用户名:image

访问量:9464

签 名:

等  级
排  名 588
经  验 4260
参赛次数 8
文章发表 5
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:对于这个问题来说,一共有三种操作,最终输出的结果又是最小的步骤  所以采用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 人评分

  评论区

  • «
  • »