首先理解了下题意,然后意识到固定一根长条放下面,让另一根长条从固定长条头上滑动找到第一个能放下去的位置即可,其实应该用上长条尾部开始和下长条头部对应开始滑动,但是这样需要在数组前部留出足够长度,因此图简单我选择直接交换上下长条位置,并取两位置状况下得到的最短答案。
后面因为自加位置的原因出了小bug调了很久很久才意识到(大哭)。代码如下
#include<iostream>
#include<cstring>
//#define LOCAL
using namespace std;
char a[210], b[210];
int get_ans(char a[],char b[]){
int i = 0, j = 0, t = 0, ans = 0;
int len1 = strlen(a), len2 = strlen(b);
while (i < len1) {
int p = i;
while (j < len2) {
int x = a[p] - '0' + b[j] - '0';
if (x > 3)
break;
else{//自加的位置十分重要,可能会在字符数组最后一个字符处判断失误
p++;
j++;
}
}
if (j <len2) {
j = 0;
i++;
} else {
t = i;
break;
}
}
if (i < len1) {
if (t + len2 > len1)
ans = len2 + t;
else
ans = len1;
} else {
ans = len1 + len2;
}
return ans;
}
int main() {
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
memset(a, '0', sizeof(a));
memset(b, '0', sizeof(b));
while (cin >> a >> b) {
int ans1=get_ans(a,b);//两个数组交换顺序对一遍
int ans2=get_ans(b,a);
if(ans1<ans2)
cout << ans1 << endl;
else
cout << ans2 << endl;
memset(a, '0', sizeof(a));
memset(b, '0', sizeof(b));
}
return 0;
}