思路:将短的字符串一直右移看是否可以满足,再将长的字符串右移看是否满足,取两者中所需最小的位数。。这样就可以找到。。
之前wa了两三次,是因为没有判断第一个字符串是比较长还是比较短的。。。还有就是在各种情况的分析吧。。。感觉我写的估计比较麻烦了
#include<stdio.h>
#include<string.h>
char a[105],b[105];
int judge(int x,int y) //x是短的
{
int i,j;
int p,q;
int flag1=0,flag2=0;
for(i=0;i<y;i++) //短的表示向右移几位
{
for(j=0;j<x;j++)
{
if(i+j>=y)
{
flag1=1;
goto out1;
}
if(strlen(a)>strlen(b)){
if(b[j]-'0'+a[j+i]-'0'>3)
break;}
else
if(b[j+i]-'0'+a[j]-'0'>3)
break;
}
if(j==x) //短的包含在长的的情况
{
flag1=1;
break;
}
}
out1:
if(flag1)
{
if(i<=y-x) //没移出去
p=y;
else
p=i+x; //出了一部分
}
else p=x+y;
for(i=0;i<x;i++) //让长的移动
{
for(j=0;j<y;j++)
{
if(i+j>=x) //长的第一位到短的最右边都满足
{
flag2=1;
goto out;
}
if(strlen(b)<strlen(a)){
if(b[j+i]-'0'+a[j]-'0'>3)
break;}
else
if(b[j]-'0'+a[j+i]-'0'>3)
break;
}
/*if(j==y) 不可能包含``这种情况不存在 之前脑残···
{
flag2=1;
break;
}*/
}
out:
if(flag2)
q=y+i;
else q=x+y;
return (p>q)?q:p;
}
int main ()
{
while (scanf("%s%s",a,b)==2)
{
int n=strlen(a);
int m=strlen(b);
int l;
if(n>m)
l=judge(m,n);
else
l=judge(n,m);
printf("%d\n",l);
}
return 0;
}
发现有办法可以大大简化代码·····而且根本不用判断长短。。这里附上别人的代码。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
char s1[110],s2[110];
int n1[210],n2[210];
int main()
{
int i,j;
while (~scanf("%s%s",s1,s2))
{
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n2));
int len1=strlen(s1);
int len2=strlen(s2);
for (i=0;i<len1;i++) n1[i]=s1[i]-'0';
for (i=0;i<len2;i++) n2[i]=s2[i]-'0';
int minlen=max(len1,len2);
for (i=0;i<len1;i++)
{
for (j=0;j<len2;j++)
{
if (n1[i+j]+n2[j]>=4)
break;
}
if (j==len2)
break;
}
int le1=len2+i;
for (i=0;i<len2;i++)
{
for (j=0;j<len1;j++)
{
if (n2[i+j]+n1[j]>=4)
break;
}
if (j==len1)
break;
}
int le2=i+len1;
minlen=max(minlen,min(le1,le2));
printf("%d\n",minlen);
}
return 0;
}