zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    vue基础04计算属性
    vue基础01条件渲染
    vue基础14vuex
    其他03动态拼接地址,使用本地的图片不显示
    其他05vue中ref
    HTML基础02CSS
    其他12es6...运算符
    其他11依赖注入
    其他07插槽
    其他06js类型判断
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270562.html
Copyright © 2011-2022 走看看