P1032 字串变换

链接P1032 字串变换

感想

这个题我也是佛了,从刚开始RE#3,WA#5,到最后RE#3,花了起码两个小时,还是很简单的逻辑问题,就是find只匹配第一个字串和没有匹配的字串时要记得退出.这些在刚开始写的时候一点都没有想到,可能那时候在想的是主逻辑能够跑通就行,所以还是建议拿笔和纸,写上todo,不然等吭哧吭哧的敲完代码再想改上鲁棒操作都不好下手…(这道题到是全靠STL过的,find函数和erase,insert函数用的很开心,甚至还想用一下replace)
你都不能想想我花了多长时间来做这个题目

code

#include <algorithm>
#include <bits/stdc++.h>
#include <map>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn = 1005;

string A[50];
string B[50];


struct node
{
    string a;
    int ans;
    node(){
        ans = 0;
    }
    node(string aa)
    {
        a= aa;
        ans = 0;
    }
};


string exchange(string s, string a, string b, int index)
{
    // cout<<s<<" "<<a<<" "<<b<<endl;
    int index2 = s.find(a, index);
    s.erase(index2, a.size());
    s.insert(index2, b);
    return s;
}


int main() 
{
#ifdef LOCAL
    freopen("C:\\Users\\hsxny\\Desktop\\in.txt", "r", stdin);
#endif
int i=0;
while(cin>>A[i]>>B[i])
{
    i++;
}
int n=i;
string a = A[0];
string b = B[0];
queue<node> q;
map<string, int> m;

node target(a);

m[target.a] = 1;
q.push(node(a));
while(1)
{

    target = q.front();
    q.pop();
//     cout<<target.a<<endl;

    if(target.a != b && target.ans>10)
    {
        cout<<"NO ANSWER!"<<endl;
        break;
    }

    if(target.a == b)
    {
        cout<<target.ans<<endl;
        break;
    }
	int flag = 1;
    for(int i=1;i<n;i++)
    {
        int index = 0;
        while(target.a.find(A[i], index)!=string::npos)
        {
            node temp;
            flag = 0;
            temp.a = exchange(target.a, A[i],B[i], index);
            index = target.a.find(A[i], index)+A[i].length();

            if(m.count(temp.a)==1)
            {
                continue;
            }
            else
            {
                m[temp.a] = 1;
                temp.ans = target.ans+1;
                q.push(temp);
            }

        }
    }
    if(q.empty()&&target.a!=b&&target.ans>1)
	{
        cout<<"NO ANSWER!"<<endl;
        break;
	}
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值