UVa1588 - Kickdown

题目

UVa1588

解读

题目意思大致为每组输入两行数,且只由1、2构成。然后上下两排需要以最小长度“咬合”在一起,像齿轮一样,不过可以1对1形成一个空缺。然后求“咬合”后的总长度的最小值。
读入时可以先用字数组储存,然后转化为数组。这样可以方便运算同时利用字符数组的易写入的特性。
之后只需两次二层循环遍历即可(分别以其中一行为固定,另一行进行移动)。不符合的条件为上下咬合后高度大于3。

笔者因为一开始没看懂题目是两个都可以移动,以为只能移动 top 导致一开始老是wrong answer.....

代码

#include <stdio.h>
#include <string.h>
#define MAXN 205

int main() {
#ifdef TEST
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif // TEST

    char ctop[MAXN], cbottom[MAXN];
    int top[MAXN], bottom[MAXN];

    while (scanf("%s%s", cbottom, ctop) == 2) {
        int i, j, lent, lenb, anw1, anw2;
        memset(top, 0, sizeof(top)); memset(bottom, 0, sizeof(bottom));
        lent = strlen(ctop); lenb = strlen(cbottom);
        for (i = 0; i < lent; i++)
            top[i] = ctop[i] - '0';
        for (i = 0; i < lenb; i++)
            bottom[i] = cbottom[i] - '0';

        for (i = 0; i < lenb; i++) {
            for (j = 0; j < lent; j++) {
                if(bottom[i + j] + top[j] > 3)
                    break;
            }
            if (j == lent)
                break;
        }
        anw1 = i + lent < lenb ? lenb : i + lent;
        for (i = 0; i < lent; i++) {
            for (j = 0; j < lenb; j++) {
                if (top[i + j] + bottom[j] > 3)
                    break;
            }
            if (j == lenb)
                break;
        }
        anw2 = i + lenb < lent ? lent : i + lenb;

        printf("%d\n", anw1 < anw2 ? anw1 : anw2);

    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容