B19 双向BFS 字串变换

视频链接:120 字串变换 双向BFS_哔哩哔哩_bilibili

Luogu P1032 [NOIP2002 提高组] 字串变换

 

 

 

#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;

const int N=7;
int n;
string A,B,a[N],b[N];

int extend(queue<string>&q, unordered_map<string,int>&da,
    unordered_map<string,int>&db, string a[], string b[]){
  int m=q.size(); 
  while(m--){                       //每次扩展一层
    auto f=q.front(); q.pop();      //父串出队
    for(int i=0; i<n; i++)          //枚举规则
      for(int j=0; j<f.size(); j++) //枚举父串中的位置
        if(f.substr(j,a[i].size())==a[i]){
          string s=f.substr(0,j)+b[i]+f.substr(j+a[i].size());
          if(da.count(s)) continue;
          if(db.count(s)) return da[f]+db[s]+1;
          da[s]=da[f]+1;  //变换步数
          q.push(s);      //子串入队
        }
  }
  return 11;
}
int bfs(){
  if(A==B) return 0;
  queue<string> qa,qb;
  unordered_map<string,int> da,db;
  qa.push(A),qb.push(B); da[A]=db[B]=0;
  
  int step=10, t;
  while(step--){
    if(qa.size()<=qb.size()) t=extend(qa,da,db,a,b);
    else t=extend(qb,db,da,b,a);
    if(t<=10) return t;
  }
  return 11;
}
int main(){
  cin>>A>>B;
  while(cin>>a[n]>>b[n]) n++;
  int t=bfs();
  t==11?printf("NO ANSWER!"):printf("%d",t);
}

 

#include<iostream>
#include<queue>
#include<unordered_map>
using namespace std;

int n;
string A,B,C[2][7]; 

int bfs(){
  if(A==B) return 0;
  queue<string> q[2];
  unordered_map<string,int> d[2];
  q[0].push(A),q[1].push(B); d[0][A]=d[1][B]=0;
  
  int step=10;
  while(step--){
    int u=(q[1].size()<q[0].size());
    int m=q[u].size();
    while(m--){                           //每次扩展一层
      string f=q[u].front(); q[u].pop();  //父串出队
      for(int i=0; i<n; i++)              //枚举规则
        for(int j=0; j<f.size(); j++)     //枚举父串中的位置
          if(f.substr(j,C[u][i].size())==C[u][i]){
            string s=f.substr(0,j)+C[u^1][i]+f.substr(j+C[u][i].size());
            if(d[u].count(s)) continue;
            if(d[u^1].count(s)) return d[u][f]+d[u^1][s]+1;
            d[u][s]=d[u][f]+1;  //变换步数
            q[u].push(s);       //子串入队
          }
    }
  }
  return 11;
}
int main(){
  cin>>A>>B;
  while(cin>>C[0][n]>>C[1][n]) n++;
  int t=bfs();
  t==11?printf("NO ANSWER!"):printf("%d",t);
}

 

posted @ 2023-06-14 10:09  董晓  阅读(474)  评论(2编辑  收藏  举报