dfs+剪枝80分#4MLE求助
查看原帖
dfs+剪枝80分#4MLE求助
828573
CurryNo_1楼主2023/1/11 22:00
#include<iostream>
#include<map>
using namespace std;
string x1,x2,s1[20],s2[20];
int n=1,maxlen=-1,minlen=0x7fffffff,flag=0,ans=0x7fffffff;
map<string,int>m;
void dfs(string s,int step)
{
    if(step>10)  return;
    if(s==x2)
    {
        ans=min(ans,step);
        flag=1;
        return;
    }
    int tmplen=s.length();
    if(s.length()<minlen)  return;
    if(flag && step>=ans)  return;
    for(int i=1;i<n;i++)//遍历寻找可以被替换的字符串 
    {
        for(int k=0;k<=s.length()-s1[i].length();k++)//遍历字符串 
        {
            if(s[k]!=s1[i][0])  continue;//首字母不同跳过 
            else//首字母与可被替换字符串的首字母相同 
            {
                string strtmp=s.substr(k,s1[i].length());//剪切出子字符串 
                if(strtmp==s1[i])//子字符串符合条件 
                {
                    string tmpstr=s;
                    tmpstr.replace(k,s1[i].length(),s2[i]);
                    //m[tmpstr]代表初始字符串转变为tmpstr所需的最小步数 
                    if(!m[tmpstr] || step+1<m[tmpstr])//当前字符串未被访问过或找到更优解 
                    {
                        m[tmpstr]=step+1;//改变状态 
                        dfs(tmpstr,step+1);//搜索下一步 
                    }
                }
            }
        }
    }
}
int main()
{
    cin >> x1 >> x2;
    while(cin >> s1[n] >> s2[n])
    {
        int tmplen=s1[n].length();
        //maxlen=max(maxlen,tmplen);
        minlen=min(minlen,tmplen);
        n++;
    }
    dfs(x1,0);
    if(!flag)  cout << "NO ANSWER!";
    else cout << ans;
}

第四个点MLE

第四个点的测试数据:
a aaaaa
a a112233445566778899
778899 a
112233 a
445 a
566 a
55 a
2023/1/11 22:00
加载中...