字串变换

字串变换

一个简单的 \(bfs\) ,只是扩展结点时比较"另类",还有一点迭代加深搜索的味道
数据范围较小,无需\(kmp\) ,暴力判断就好

认识到了两点

  1. \(\because\) 无符号数相减不会出现负数,\(\therefore\) 当小数减大数时会得到一个很大的数. \(\therefore\) 应该避免无符号数相减
  2. 在提交程序之前一定要仔细检查是否有为了调试而输出的中间结果!
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <map>
using namespace std;
const int MAXN=30;
string a[MAXN],b[MAXN];
map<string,int>vis;
struct state
{
    string s;
    int dist;
    state(string ss,int d):s(ss),dist(d){}
};

queue<state>Q;

int main()
{
    string A,B,c,d;
    int ans = 100+1;
    cin >> A >> B;
    
    int n=0;
    while(cin >> c >> d)
    {
        a[++n] = c;
        b[n] = d;
    }

    Q.push(state(A,0));
    
    while(!Q.empty())
    {
        state u = Q.front();Q.pop();
        
        string& s=u.s;
        
        if(s == B)
        {
            ans = u.dist;
            break;
        }
        
        for(int i = 1; i <= n; i++)
        {
            const int len1 = s.length(), len2 = a[i].length() ;
            //不能用 s.length() - a[i].length(),因为无符号数相减,
            //若被减数小于减数,结果不是负数而是一个很大的正数,会导致 j 超出范围!
            for(int j = 0;j <= len1 - len2; j++)
            {
                if(s.substr(j, a[i].length() ) == a[i])
                {
                    string v = s;
                    v.replace(j,a[i].length(),b[i]);
                    if(!vis.count(v))
                    {
                        vis[v]=1;
                        Q.push(state(v, u.dist + 1));
                    }
                }
            }
        }
    }

    if(ans <= 10)cout << ans;
    else cout << "NO ANSWER!";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhinv/p/9563225.html