题解 | #玛雅人的密码#
玛雅人的密码
https://www.nowcoder.com/practice/761fc1e2f03742c2aa929c19ba96dbb0
//BFS宽度优先搜索 #include <iostream> #include <string> #include <queue> #include <map> using namespace std; struct strtype{ string value; int num; strtype(string s,int n):value(s),num(n){} }; queue<strtype> myqueue; map<string ,bool> mymap; int BFS(int n){ while(!myqueue.empty()){ strtype current=myqueue.front(); myqueue.pop(); //如果当前值匹配2012,返回其对应的交换次数 if(current.value.find("2012")!=string::npos){ return current.num; } //未匹配,就把新一轮交换的放进队列里 string str=current.value; int num=current.num; string temp; for(int i=0;i<n-1;i++){ temp=str; char c=temp[i]; temp[i]=temp[i+1]; temp[i+1]=c; if(mymap.find(temp)!=mymap.end()){//如果已经匹配过这个字符串了 continue; } else{//未匹配过的就标记一下,并且放进队列里 mymap[temp]=true; myqueue.push(strtype(temp,num+1)); } } } return -1; } int main() { int n; while(cin>>n){ mymap.clear(); myqueue=queue<strtype>(); string str; cin>>str; myqueue.push(strtype(str,0)); mymap[str]=true; cout<<BFS(n)<<endl; } return 0; }