题目:
题目大意:
让你求解出原字符串怎样通过已有的规则变化为目标串,输出所用到的规则。
题目思路:
这样的话,我们先将所谓的规则写成相应的函数,然后利用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;
}