社区讨论

蒻篛求助,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 条回复,欢迎继续交流。

正在加载回复...