题目前置知识
1.为啥BFS比DFS更加适合找最短路径?
BFS 的使用场景:层序遍历、最短路径问题 - 知乎 (zhihu.com)
题目原题
解题思路
这道题和原先写的那些题目不同的是,这次BFS所搜索的树里面存放的是一个字符串,也就是说没有路径一说,我们需要一个map来存不同的字符串自身和自己从根字符串变来的步数。
queue<string> q;
//用来存储从根串变化到其他串需要的步数,以及由根串变化而来的其他串。
unordered_map<string,int> dist;
画个图出来也就是这样的(以题目中给的提示中的例子来解释一下):
我们一层一层向下搜索,直到搜到那个满足条件的字符串返回就是了。
//比较其他字符串是否包含“2012”,若包含直接返回
for(i=0;i<n-3;i++){
if(r.substr(i,4) == "2012"){
// cout<<" r:"<<r<<" dist[r]:"<<dist[r]<<endl;
return dist[r];
}
}
AC代码
#include <iostream>
#include <cstring>
#include <queue>
#include <unordered_map>
using namespace std;
int n;
int BFS(string str){
queue<string> q;
//用来存储从根串变化到其他串需要的步数,以及由根串变化而来的其他串。
unordered_map<string,int> dist;
q.push(str);
dist[str] = 0;
int i;
while(q.size()){
string r = q.front();
q.pop();
//比较其他字符串是否包含“2012”,若包含直接返回
for(i=0;i<n-3;i++){
if(r.substr(i,4) == "2012"){
// cout<<" r:"<<r<<" dist[r]:"<<dist[r]<<endl;
return dist[r];
}
}
//遍历交换,将由上一层某一节点
//变化而来的字符串都放入队列q中(不重复存放)
for(i=1;i<n;i++){
string o = r;
swap(o[i],o[i-1]);
if(!dist.count(o)){
dist[o] = dist[r] + 1;
// cout<<"o:"<<o<<" r:"<<r<<" dist[r]:"<<dist[r]<<endl;
//(不重复存放)
q.push(o);
}
}
}
//没找到返回-1
return -1;
}
int main(){
string str;
cin>>n>>str;
cout<<BFS(str)<<endl;
return 0;
}