Kickdown

UVa 1588

做了这道题就感觉自己基础还是不行,好多地方考虑错了,一直考虑长的一定是放下面的,

但是这个考虑是错的,比如:

222222222
221111

所以长短都需要放下面匹配。

#include <stdio.h>
#include <string.h>
#define INF 1000005
const int maxn = 205;
char str[maxn], ch[maxn], t[maxn];
void swap ( int & a, int & b )
{
    int t = a;
    a = b;
    b = t;
}
inline int Min ( int a, int b )
{
    return a < b ? a : b;
}
inline int Max ( int a, int b )
{
    return a > b ? a : b;
}
int main ( )
{
    int len1, len2, ans, ok, x1, x2;
    while ( ~ scanf ( "%s%s", str, ch ) )
    {
        len1 = strlen ( str );
        len2 = strlen ( ch );
        memset ( str+len1, '0', sizeof ( str )-len1 );
        memset ( ch+len2, '0', sizeof ( ch )-len2 );
        //将后面空余全部赋为0,因为需要匹配到len1+len2
        int i;
        for ( i = 0; i < len1; i ++ )
        {
            int j;
            for ( j = 0; j < len2; j ++ )
            {
                if ( ( str[i+j]-'0' )+( ch[j]-'0' ) > 3 )
                    break ;
            }
            if ( j >= len2 )
                break ;
        }
        x1 = len2+i;    //x1不能放里面,因为可能匹配不成功
        for ( i = 0; i < len2; i ++ )
        {
            int j;
            for ( j = 0; j < len1; j ++ )
                if ( ( str[j]-'0' )+( ch[i+j]-'0' ) > 3 )
                    break ;
            if ( j >= len1 )
                break ;
        }
        //第一个字符串和第二个字符串放下面的情况都要考虑
        x2 = len1+i;
        printf ( "%d\n", Max ( Max ( len1, len2 ), Min ( x1, x2 ) ) );
    }
    return 0;
}
//特殊数据,这样短的不一定要匹配长的
//222222222
//221111


你可能感兴趣的:(Kickdown)