双向宽搜:从起点和终点同时进行bfs,降低时间复杂度,多用于最小步数模型。
两个队列中哪个包含的元素少则遍历哪个,保证数据遍历的最高峰在中点。
unordered_map中的count
用法:
size_type count(Key);
参数:此函数接受单个参数 key ,需要在给定的unordered_map容器中进行检查。
返回值:如果Map中存在具有给定键的值,则此函数返回1,否则返回0。
*不能用da[vt],因为只能是查看容器中是否有该值,[]是指容器中的值的int值。
#includeusing namespace std; const int N = 22; string a[N],b[N];//变化规则; int n; queue qa,qb;//记录状态 unordered_map da,db;//记录状态的步数 int extend(queue & q,unordered_map & da,unordered_map & db,string a[N],string b[N]) { string t=q.front(); q.pop(); if(db.count(t))return da[t]+db[t]; //先遍历字符串长度,再遍历规则 for(int i=0;i t->state->B if(db.count(vt))return da[t]+1+db[vt]; da[vt]=da[t]+1; q.push(vt); } } } //没搜到,返回一个大于10的数,继续搜 return 11; } int bi_bfs(string A,string B) { qa.push(A),da[A]=0; qb.push(B),db[B]=0; while(qa.size()&&qb.size()) { int t; if(qa.size()<=qb.size())t=extend(qa,da,db,a,b); //从终点bfs,变化规则由b到a else t=extend(qb,db,da,b,a); if(t<=10)return t; } //搜不到,返回一个比10大的数 return 11; } int main() { string A,B; cin>>A>>B; while(cin>>a[n]>>b[n])n++; int step=bi_bfs(A,B); if(step>10)puts("NO ANSWER!"); else cout<



