字串变换

Posted zhinv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字串变换相关的知识,希望对你有一定的参考价值。

字串变换

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

认识到了两点

  1. (ecause) 无符号数相减不会出现负数,( herefore) 当小数减大数时会得到一个很大的数. ( herefore) 应该避免无符号数相减
  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;
}

以上是关于字串变换的主要内容,如果未能解决你的问题,请参考以下文章

字串变换

1099 字串变换

NOIP2002 字串变换题解(双向搜索)

codevs1099 字串变换

[NOIP2002]字串变换 T2 双向BFS

luogu P1032 字串变换