社区讨论
蒻篛求助,wa了2,5点,用的双向广搜
P1032[NOIP 2002 提高组] 字串变换(疑似错题)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo9j8jrx
- 此快照首次捕获于
- 2023/10/28 12:18 2 年前
- 此快照最后确认于
- 2023/10/28 12:18 2 年前
CPP
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <unordered_map>
using namespace std;
string A,B,a[6],b[6];
unordered_map<string,int>da,db;
queue<string>Q1,Q2;
int num=0;
int extrend(int tt)
{
if(tt==1)
{
string state=Q1.front();Q1.pop();
for(int i=0;i<num;i++)
{
int h=state.find(a[i]);
if(h!=-1)
{
string source=state;
state.replace(h,a[i].size(),b[i]);
if(!da[state])
{
da[state]=da[source]+1;
Q1.push(state);
}
}
if(db[state]||state==A||state==B)
{
return db[state]+da[state];
}
if(da[state]+db[state]>10)return -1;
}
}
else
{
string state=Q2.front();Q2.pop();
for(int i=0;i<num;i++)
{
int h=state.find(b[i]);
if(h!=-1)
{
string source=state;
state.replace(h,b[i].size(),a[i]);
if(!db[state])
{
db[state]=db[source]+1;
Q2.push(state);
}
}
if(da[state]||state==A||state==B)
{
return da[state]+db[state];
}
if(db[state]+da[state]>10)return -1;
}
}
return 0;
}
int bfs(string A,string B)
{
Q1.push(A),Q2.push(B);
da[A]=0,db[B]=0;int tt=1,t=0;
while(Q1.size()&&Q2.size())
{
if(tt==1)
{
int h1=extrend(tt);
if(h1!=-1&&h1!=0)
{
t=h1;break;
}
else if(h1==-1)return 0;
}
else
{
int h1=extrend(tt);
if(h1!=-1&&h1!=0)
{
t=h1;break;
}
else if(h1==-1)return 0;
}
Q1.size()>Q2.size()?tt=-1:tt=1;
}
if(t!=0)return t;
else return 0;
}
int main()
{
cin>>A>>B;
while(cin>>a[num]>>b[num])num++;
int c=bfs(A,B);
if(c)
cout<<c;
else cout<<"NO ANSWER!";
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...