共48道题,当前是第42

初赛真题

01 #include <stdio.h>
02 
03 char c[200][200];
04 int s[200], m, n;
05 void numara() {
06     int i, j, cod, nr;
07     for (j = 0; j < n; j++) {
08         nr = 0;
09         cod = 1;
10         for (i = 0; i < m; i++) {
11             if (c[i][j] == '1') {
12                 if (!cod) {
13                     cod = 1;
14                     s[nr]++;
15                     nr = 0;
16                 }
17             } else {
18                 if (cod) {
19                     nr = 1;
20                     cod = 0;
21                 } else nr++;
22             }
23         }
24         if (!cod) s[nr]++;
25     }
26 }
27 int main() {
28     int i, j;
29     scanf("%d %d\n", & m, & n);
30     for (i = 0; i <= m; i++) gets(c[i]);
31     numara();
32     for (i = 1; i <= m; i++)
33         if (s[i] != 0) printf("%d %d", i, s[0]);
34     return 0;
35 }
输入保证是正整数 $m$ 和 $n$ 以及一个 的 01 矩阵,且相邻元素之间没有空格。如下例:
2 4
0101
1000



1. B。
2. A。
3. B。
4. B。
5. C。
6. D。

这段代码是在对这个矩阵的每一列分别求解,求每一列中的 $0$ 构成的连续段有哪些,长度分别为多少。代码中将这个数据存入了桶中,也就是 $s[i]$ 数组。 $s[i]$ 表示这个矩阵的所有列中,长度为 $i$ 的连续的 $0$ 一共有 $s[i]$ 个。对于每一列的统计中,通过变量 $cod$ 和 $nr$ 的配合,前者表示上一个数字是否是 $1$ ,$nr$ 则表示当前有多少个连续的 $0$ 。

Question

1. 若将第 28 行的 int i, j; 改为 int i; ,则程序会出现编译错误。()

2. 程序最少输出 0 个数,最多输出 2 * m 个数。()

3. s[i] 表示矩阵中有 s[i] 个列有 1 个 0 。( )

4. 若把第 13 行的 cod = 1; 和第 20 行的 cod=0; 全部换成 cod =1; ,则程序运行结果不变。( )

5. 若 m = 100, n = 100 ,则 s[1] 的最大值是( )。

6. 若 m = 95, n = 95,则 s[5] 的最大值是( )