编程语言
首页 > 编程语言> > 算法竞赛入门经典(第二版)3-11换低挡装置UVA-1588

算法竞赛入门经典(第二版)3-11换低挡装置UVA-1588

作者:互联网

这题想了好久啊!!!还各种小细节出错,我太菜了,要更加努力才行

这回要把解题思路写一写,不然估计过几天就忘了

解题思路:

长条固定,移动短条去匹配长条,有三种情况

第一种,在短条在长条范围内移动匹配

 

 

第二种,短条在长条的左边移动匹配

 

第三种,短条在长条右边,与左边的情况同理,右移到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