2019北理工夏令营机试

2019北理工计算机夏令营机试

今年北理工计算机夏令营一共两道机试题,上机环境为dev c++,支持STL和C++11。测试为黑盒测试,即老师给你一张纸,每个题输入上面的三个样例,根据通过的数目给分。今年机试题分为两组进行,难度较往年来说有所加大,区分度高了一些,以下是第二组的题目及思路。

第一题

题目:给你一个m*n大小的矩阵,每个点有0,1,2三种取值;0代表障碍物,1代表白纸,2代表墨滴。每一秒墨滴可以向其上下左右扩散,将四周的白纸染色,被染色之后的白纸可以继续向四周扩散,以此类推。问经过几秒,矩阵中所有的白纸都被染色,如果可以,则输出扩散时间;如果不可以,则输出FALSE。

输入: m n 的大小以及矩阵每个点的值

输出:扩散时间 或 FALSE

例如:
输入:
3 3
0 1 0
1 2 1
0 1 0
输出:1

输入:
3 3
0 1 0
1 2 1
0 1 1
输出:2

输入:
2 3
1 0 0
0 0 2
输出:FALSE

个人思路:这道题感觉和leetcode上“腐烂的橘子”一题很像,首先需要找到初始状态下所有值为2的点(注意:值为2的点在一开始可能不仅仅为1个),然后再设一个队列,利用BFS求解即可。

第二题

题目:输入三个字符串,问第三个字符串能否由前两个字符串多次重复组合形成。如果能,则输出前两个字符串各自的使用次数;如果不能,则输出FALSE。

输入:三个字符串

输出:前两个字符串各自的次数 或 FALSE

例如:

aa bb bbaaaabbaa

输出:3 2

ab ba abbaaabaab

输出:FALSE

个人思路:乍一看感觉这个题挺简单,从头开始,挨个往后匹配就可以了,也就是先匹配第一个,如果可以,就去找当前位置加上第一个字符串长度的地方继续匹配,第一个不成功再去匹配第二个。但是仔细想想有这么一种情况,例如第一个字符串为aa,第二个字符串为aab,第三个字符串为aabaa,这种输入是可以匹配成功的,但用上述方法显然会输出FALSE。因此本题我才用的思路是用DFS+回溯,即在同一个位置上让两个模式串都去试着匹配一下,在匹配到尾部的时候返回即可。

总结

今年北理机试题较往年来说难度有所增加,两道题一道BFS,一道DFS,但也不是太难,基本都是板子题,多刷刷leetcode还是很有用的。

如有疑问,欢迎大家一起交流~

你可能感兴趣的:(夏令营)