题目链接: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;
}