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;
    }
  • 相关阅读:
    (转)6 个重构方法可帮你提升 80% 的代码质量
    (转)卸载和安装LINUX上的JDK
    (转)一些国外优秀的elasticsearch使用案例
    (转)Redis 集群方案
    (转)理想化的 Redis 集群
    (转)Hprose与WCF在云计算平台Azure上的对决
    (转).NET技术+25台服务器怎样支撑世界第54大网站
    Hbase split的过程以及解发条件
    test
    HTTP和HTTPS详解
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270562.html
Copyright © 2011-2022 走看看