題目
UVa1588
解讀
題目意思大致為每組輸入兩行數(shù)谍夭,且只由1畔况、2構(gòu)成。然后上下兩排需要以最小長(zhǎng)度“咬合”在一起慧库,像齒輪一樣跷跪,不過可以1對(duì)1形成一個(gè)空缺。然后求“咬合”后的總長(zhǎng)度的最小值齐板。
讀入時(shí)可以先用字?jǐn)?shù)組儲(chǔ)存吵瞻,然后轉(zhuǎn)化為數(shù)組。這樣可以方便運(yùn)算同時(shí)利用字符數(shù)組的易寫入的特性甘磨。
之后只需兩次二層循環(huán)遍歷即可(分別以其中一行為固定橡羞,另一行進(jìn)行移動(dòng))。不符合的條件為上下咬合后高度大于3济舆。
筆者因?yàn)橐婚_始沒看懂題目是兩個(gè)都可以移動(dòng)卿泽,以為只能移動(dòng) top 導(dǎo)致一開始老是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;
}