POJ 3158 Kickdown(水~)

Description
生产了两种齿轮,2表示凸齿、1表示凹槽,凸齿处高度为2h,凹槽处高度为1h,现在有一个高度为3h的盒子,要去装这两个齿轮,问至少要多长才可以装得下,要求两个齿轮不可以横向翻转
Input
只有一组用例,占两行,每行一个数字串表示齿轮
Output
输出两齿轮互相咬合后的最短长度
Sample Input
sample input #1
2112112112
2212112
sample input #2
12121212
21212121
sample input #3
2211221122
21212
Sample Output
sample output #1
10
sample output #2
8
sample output #3
15
Solution
分别选择其中一个字符串不动,另一个字符串从相对它的k位置开始匹配(k=0,1,2,…),如果找得到可以刚刚好卡进的凸齿和凹槽的情况,就输出当前总长度即可;如果没有就将两个字符串的位置颠倒,再进行一次这样的平移+匹配
Code

#include<stdio.h>
#include<string.h>
#define min(x,y) ((x)<(y)?(x):(y))
int main()
{
    char s1[120],s2[120];
    int len1,len2,l1[120],l2[120],i,j,i1,j1,min,flag;
    gets(s1);
    gets(s2);
    len1=strlen(s1);
    len2=strlen(s2);
    min=len1+len2;//初始化最短长度 
    for(i=0;i<len1;i++)//将字符串转化为数字 
        l1[i]=s1[i]-'0';
    for(i=0;i<len2;i++)//将字符串转化为数字
        l2[i]=s2[i]-'0';
    for(i=0,j=len2-1;i<len1;i++)
    {
        flag=1;
        for(i1=i,j1=j;i1>=0&&j1>=0;i1--,j1--)
            if(l1[i1]+l2[j1]>3)//不能咬合 
            {
                flag=0;
                break;
            }
        if(flag)//更新最短长度 
            min=min(min,(len1+len2-min(len2,i+1)));             
    }
    for(j=0,i=len1-1;j<len2;j++)
    {
        flag=1;
        for(i1=i,j1=j;i1>=0&&j1>=0;i1--,j1--)
            if(l1[i1]+l2[j1]>3)//不能咬合
            {
                flag=0;
                break;
            }
        if(flag)//更新最短长度 
            min=min(min,(len1+len2-min(len1,j+1)));             
    }
    printf("%d\n\n",min);
    return 0;
}

你可能感兴趣的:(POJ 3158 Kickdown(水~))