习题3-11 换抵挡装置(Kickdown,ACM/ICPC NEERC 2006,UVa1586)

原题链接:https://vjudge.net/problem/UVA-1588
分类:字符串
备注:水题
思路:注意一下两种方向的移动都可能为答案。
代码如下:似乎下面的两个相似的部分可以弄成一个函数缩短代码量。

#include<stdio.h>
#include<string.h>
int main(void)
{
	char s1[300], s2[300];
	while (scanf("%s%s", s1, s2) == 2)
	{
		int len1 = strlen(s1), len2 = strlen(s2);
		int ans1, ans2, flag = 1, st = 0;
		//在上面的要不停移动到配对为止,先是s1在上面,st表示从下面字符的第几个开始配对
		while (flag)
		{
			flag = 0;
			for (int i = st, j = 0; i < len2 && j < len1; i++, j++)
				if (s1[j] == '2' && s2[i] == '2') { flag = 1; break; }
			st++;
		}
		int temp = len2 - (--st);
		if (temp >= len1)ans1 = len2;//配对后上面字符的尾巴没超过下面字符
		else ans1 = st + len1;//上面字符尾巴超过了下面字符
		flag = 1, st = 0;
		while (flag)//s2在上面移动
		{
			flag = 0;
			for (int i = st, j = 0; i < len1 && j < len2; i++, j++)
				if (s2[j] == '2' && s1[i] == '2') { flag = 1; break; }
			st++;
		}
		temp = len1 - (--st);
		if (temp >= len2)ans2 = len1;
		else ans2 = st + len2;
		printf("%d\n", ans1 < ans2 ? ans1 : ans2);
	}
	return 0;
}
发布了22 篇原创文章 · 获赞 23 · 访问量 505

猜你喜欢

转载自blog.csdn.net/TK_wang_/article/details/104382923