[BFS] [洛谷] P1032 字串变换

“年轻人切忌旋入技术细节漩涡, 那是无底之洞”            ----Zeo

基础BFS加一堆字符串处理细节

逐个比较是否可替换

替换时把字符拆成三段 前 要替换的 后

根据string 特性

前 + 替换的 + 后 可得操作完毕后串

++步数压入队列继续BFS

 map 进行判重

坑的不行

写的想吐

没感到任何技术提升

代码

#include <iostream>
#include <queue>
#include <map>

using namespace std;

int ans = 0;

string bts[6], ats[6];

string B;

map < string , int > m;

struct trr
{
    string str;
    int step;
}A;

queue <trr> q;

int tf = 0;

string trans(string a, int flag, int btsf)
{
    string f = "", l = "", ans = "";
	
	for(int i = 0; i < flag; i++)
		f = f + a[i];
		
	for(int i = flag + bts[btsf].length(); i < a.length(); i++ )
		l = l + a[i];
		
	f = f + ats[btsf] + l;

    return f;
}

void bfs(trr A)
{
    q.push(A);

    while(!q.empty())
    {
        trr ret = q.front();
		
		trr sa;
		
        q.pop();

        for(int i = 0; i < ret.str.length(); i++)
        {
            for(int j = 0; j < tf; j++)
            {
                string tmpt = bts[j];
				
				if(ret.str[i] == tmpt[0] && i + tmpt.length() < ret.str.length() + 1)
				{
					for(int k = 0; k < tmpt.length(); k++)
					{
						if(ret.str[k + i] != tmpt[k])
							goto l1;
					}
					
					sa.str = trans(ret.str, i, j);
					
					sa.step = ret.step + 1;
					
                    
					if(sa.step > 10)
					{
						ans = sa.step;
						
						return ;
					}
					
					if(sa.str == B)
					{
						ans = sa.step;
						
						return ;
					}
					
					if(m[sa.str] == 0)
					{
						q.push(sa);
						m[sa.str] ++;
					}
				}
				l1:
					continue;
            }
        }
    }
}

int main()
{
	cin>>A.str;
	
	A.step = 0;
	
    cin>>B;

    while(cin>>bts[tf]>>ats[tf])
    {
    	tf++;
	}
	
	bfs(A);

    if (ans == 0 || ans > 10)
        cout<<"NO ANSWER!"<<endl;
	else
		cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/zeolim/p/12270562.html