UVa 414 - Machined Surfaces 解题报告

题目链接:http://uva.onlinejudge.org/external/4/414.html


题目分析

这道题的题目挺长。其实要完成的任务是通过左右平移来拼接机器(左边和右边分别是一个固定的块,要整体平移),直到左右两边的机器有相接触的地方,此时统计还剩多少个空。通过字符串输入平移前机器的样子,输出平移后的间隙(即空格)。

        拼接前                          拼接后
左                      右
XXXX                XXXXX            XXXX XXXXX
XXX               XXXXXXX            XXXXXXXXXX  <<- 这行最先接触,接触后全部行停止平移
XXXXX                XXXX            XXXXX XXXX
XX                 XXXXXX            XX  XXXXXX

题目只需要求出平移后的结果,我们大可不必模拟每一步平移的过程,而是直接去算最后一步。

因为肯定是最长(X 最多)的那行先接触,所以它是无缝拼接,该行的空格数为 0;
其他行的空格数 = 最长行宽度 - 本行 X 数。

因此,只需要在全部输入后找出最长行,算出每行的空格空格数并累加起来即可。


解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <string.h>

/* 行 */
typedef struct row_type {
int leftlen;
int rightlen;
int sum;
} row_type;

row_type row[15];
char buf[30];

int main(void)
{
int n, i, len, maxsum, blank = 0;

for (;;) {
scanf("%d", &n);
if (n > 0) {
for (i = 0; i < n; i++) {
scanf("%s", buf); /* 左块 */
len = strlen(buf);
if (len == 25) { /* 整行都是X */
row[i].leftlen = len;
row[i].rightlen = 0;
row[i].sum = len;
} else {
row[i].leftlen = len;
scanf("%s", buf); /* 右块 */
row[i].rightlen = strlen(buf);
row[i].sum = row[i].leftlen + row[i].rightlen;
}
}

/* 找到最宽(X最多)的行 */
for (i = 1, maxsum = row[0].sum; i < n; i++)
if (row[i].sum > maxsum)
maxsum = row[i].sum;

/* 统计剩余空格数 */
for (i = 0, blank = 0; i < n; i++)
blank += maxsum - row[i].sum;

printf("%d\n", blank);
}
else break;
}

return 0;
}