题目
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;
}