题目链接:https://vjudge.net/problem/UVA-1588
题解:这个题需要注意以下几个方面
1.注意循环中的break判定条件是循环完后
2.不用考虑把短串反过来
3.需要考虑短串放在长串上。从一段到另一端
代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#define maxn 110
using namespace std;
string ll,ss;
int ans;//答案
int l,s;//长串的长度和短串的长度
int main()
{
    while(cin>>ll)
    {
        cin>>ss;
        string sk;
        if(ll.length()<ss.length())
        {
            sk=ll;
            ll=ss;
            ss=sk;
        }
        int small[maxn];
        int sma[maxn];
        int lon[maxn];
        l=ll.length();
        s=ss.length();
        memset(sma,0,sizeof(sma));
        memset(lon,0,sizeof(lon));
        memset(small,0,sizeof(small));
        for(int i=1; i<=l; i++)
            lon[i]=ll[i-1]-'0';
        for(int i=1; i<=s; i++)
            small[i]=ss[i-1]-'0';
        int mov,flag=0;//移动的步数,循环是否进行的标志
        for(mov=0; mov<=l; mov++)
        {
            for(int i=1; i<=s; i++)
            {
                if(i+mov<=l)
                {
                    if(lon[i+mov]+small[i]>3)
                        break;
                }
                if(i==s)
                    flag=1;
            }
            if(flag==1)
                break;
        }
        if(mov+s<=l)
            ans=l;
        else
            ans=mov+s;
        flag=0;
        for(mov=1;mov<=s;mov++)
        {
            for(int i=1;i<=s;i++)
            {
                if(i+mov<=s)
                  if(small[i+mov]+lon[i]>3)
                    break;
                if(i+mov==s)
                    flag=1;
            }
            if(flag)
                break;
        }
        int ans2=mov+l;
        cout<<min(ans,ans2)<<endl;
    }
    return 0;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐