思路:将短的字符串一直右移看是否可以满足,再将长的字符串右移看是否满足,取两者中所需最小的位数。。这样就可以找到。。
之前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; }