程序填空小测试

 

不知道为什么,和标准答案对比,我应该得12分,而我的最终分数(评测分)为3分Why? Why? Why?

题目的源代码可以在这里查看

第一题

螺旋矩阵输出(5小题)

注:visvisit的简称

(1)正确
(2)错误

原题:

2 处应填:

A. vis[x][y] = 1 B. print(x, y, flag + 1) C. print(x, y+1, flag) D. vis[x][y] = 0

正确答案:A

cout << a[x][y] << " ";之后需要将a[x][y]标记为已访问过,即vis[x][y] = 1;。23,25行已经调用过下层递归了(即print(x, y, flag)),在这里再调用一次就有点不太像话了不符合实际情况,所以不能选B或C。

(3)正确
(4)错误

原题:

4 处应填:

A. vis[x][y] == 1 B. vis[x][y] == 0 C. vis[nxt_x][nxt_y] == 0 D. vis[nxt_x][nxt_y] == 1

正确答案:D

4 处所对应的$\mathit if$语句的内容为print(x, y, (flag + 1) % 4);。此处(flag + 1) % 4为顺时针旋转$90^o$(0->1,1->2,2->3,3->0,转到下一个方向,这也是这段代码如何实现转向的原理)。之所以要转向,是因为下一个位置无法达到,也就说明下一个位置已经被访问过,也被输出过,翻译成代码就是vis[nxt_x][nxt_y] == 1

$\mathit else$语句中的内容表示如果没有上述情况,则正常走下一个。

(5)错误

原题:

5 处应填:

A. print(1, 1, 0) B. print(0, 0, 0) C. print(1, 1, 1) D. print(0, 0, 1)

正确答案:A

这是一道送分题,非常简单,但即便是送分题,我还是做错了。

应该注意:矩阵的坐标是从(1,1)开始,并不是从(0,0)开始,而且一开始画图方向朝右,所以flag==0考虑到这些,就3分到手了

第二题

栅栏涂色(5小题)

注:resresult的简称

(1)正确
(2)错误

原题:

2 处代码应该填:

A. get_st(i, minn); B. i C. i + 1 D. res

正确答案:B

第18行(也就是上一行)进行了上一段递归,那第19行就需进行下一段递归,则需要将st替换为下一段递归的起点,也就是i,则选B。

(3)错误

原题:

3 处代码应该填:

A. dfs(st, r-1) B. dfs(st+1, r) C. dfs(st, r) D. dfs(st+1, r-1)

正确答案:C

22行$\mathit if$语句的内容为st<=r,说明还有一些“栅栏”(最后一段)没有开始递归。也就是最后没有minn,就把最后的全部进行递归,应该到r,而不是到r-1

(4)错误

原题:

4 处代码应填:

A. res+1 B. res C. res + dfs(l, st) + dfs(st, r) D. res + dfs(l, st - 1) + dfs(st + 1, r)

正确答案:C

之前的几段递归求了所有的和,但最后return的并不是res,而是将res加上第一段递归(从lst),再加上第二段递归(从str)。

(5)正确

本篇文章到此结束