标签:11 1588 min int flag len2 len1 maxn UVA
这题想了好久啊!!!还各种小细节出错,我太菜了,要更加努力才行
这回要把解题思路写一写,不然估计过几天就忘了
解题思路:
长条固定,移动短条去匹配长条,有三种情况
第一种,在短条在长条范围内移动匹配
第二种,短条在长条的左边移动匹配
第三种,短条在长条右边,与左边的情况同理,右移到0与5相等的位置停止匹配
实现代码
#include<stdio.h> #include<string.h> #include <stdlib.h> #define maxn 100 int match(int b1[maxn],int b2[maxn],int len1,int len2) { // int len1=length1,len2=length2; int min=len1+len2,flag=0; for(int k=0;k<=len2-len1;k++)//短串在长串内的情况 { int t=0; for(;t<len1;t++)//从左到右,短串移动匹配 { //printf("b1[%d]=%d b2[%d]=%d\n",t,b1[t],t+k,b2[t+k]); if(b1[t]+b2[t+k]>3) { break; } } if(t==len1){flag =1;break;} } if(flag==1) {min=len2;return (min);} else { int r=1; for(;r<len1;r++)//短串在左边,向左移动的情况 { int s=0; for(;s<len1-r;s++)//逐个匹配 { if(b1[s+r]+b2[s]>3){break;} } if(s==len1-r){flag=1;break;} } if(flag==1) {min=len2+r;} int n=1;flag=0; for(;n<len1;n++)//短串在右边的,向右移动情况 { int m=len1-1; for(;m>=n;m--)//逐个匹配 { //printf("b1[%d]=%d b2[%d]=%d\n",m-n,b1[m-n],m-len1+len2,b2[m]); if(b1[m-n]+b2[m-len1+len2]>3){break;} } if(m<n){flag=1;break;} } if(flag==1){min=len2+n>min?min:len2+n ;return min;} else{return min;} } } int main() { char a1[maxn],a2[maxn]; int c1[maxn]={0},c2[maxn]={0}; gets(a1); gets(a2); int length1=strlen(a1); int length2=strlen(a2); for(int i=0;i<length1;i++) { c1[i]=a1[i]-48;//'0'的ASCII码=48 } for(int j =0;j<length2;j++) { c2[j]=a2[j]-48; } int num=length1<=length2?match(c1,c2,length1,length2):match(c2,c1,length2,length1); printf("Min_length=%d",num); }
https://vjudge.net/problem/UVA-1588
标签:11,1588,min,int,flag,len2,len1,maxn,UVA 来源: https://www.cnblogs.com/lytuser/p/11734433.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。