计蒜客 矩阵变换 (bfs+set)

来源:互联网 发布:手机知乎怎么复制 编辑:程序博客网 时间:2024/06/02 02:31

题目:


题目大意:

让你求解出原字符串怎样通过已有的规则变化为目标串,输出所用到的规则。

题目思路:

这样的话,我们先将所谓的规则写成相应的函数,然后利用bfs进行字符串的变换,知道字符串变为目标串结束,如果你不进行visit标记的话,那么MLE,如果采用O(n)的方法来标记的话,肯定会超时,那么就用set作为标记数组,这样就能得出相应的结果。

代码:

#include <bits/stdc++.h>using namespace std;string s;//最开始串string as;//目标串set<string>sset;bool checkvisit(string s){    if(sset.find(s)!=sset.end())return false;    return true;}struct node{    string mys;    string ans;};string ca(string s){    string b;    for(int i=s.size()-1;i>=4;i--)        b.push_back(s[i]);    for(int i=3;i>=0;i--)        b.push_back(s[i]);    return b;}string cb(string s){    string b;    b.push_back(s[3]);    for(int i=0;i<3;i++) b.push_back(s[i]);    for(int i=5;i<s.size();i++) b.push_back(s[i]);    b.push_back(s[4]);    return b;}string cc(string s){    string b;    int a[8]={1,7,2,4,5,3,6,8};    for(int i=0;i<8;i++)        b.push_back(s[a[i]-1]);    return b;}void bfs(){    queue<node>Q;    node start;    start.mys=s;    sset.insert(s);    Q.push(start);    while(!Q.empty()){        node now=Q.front();Q.pop();        if(now.mys==as){            cout<<now.ans<<endl;            break;        }        node next;        string tmp;        tmp=ca(now.mys);        next.mys=tmp,next.ans=now.ans;        if(checkvisit(next.mys)){            next.ans.push_back('A');            Q.push(next);            sset.insert(next.mys);        }        tmp=cb(now.mys);        next.mys=tmp,next.ans=now.ans;        if(checkvisit(next.mys)){            next.ans.push_back('B');            Q.push(next);            sset.insert(next.mys);        }        tmp=cc(now.mys);        next.mys=tmp,next.ans=now.ans;        if(checkvisit(next.mys)){            next.ans.push_back('C');            Q.push(next);            sset.insert(next.mys);        }    }}int main(){    cin>>s>>as;    bfs();    return 0;}



原创粉丝点击