侥幸通过Pre的一点记录和心得,希望对大家有些微的帮助
1.supaltitude
思路:题目所求即为数组最大前缀和,维护一个变量保存当前前缀和,并维护最大值即可,没有开辟数组空间的必要
注:保存最高海拔的前提是数组的下标连续,而不能像买卖理财产品,只在有收益的时候售出。也即如下的代码思路是错误的(虽然我相信聪明的大家都想到了)
1 | if (data > 0) { // data is the input value |
代码挖空:
1 | .text |
此外建议大家在编写汇编代码时多用伪指令,能显著加快编程速度(毕竟这就是伪指令的使命)
如 blt
省去了 slt
和 beq
的使用,将两条指令合为一条;move
比 add
指令少一个操作数;li
比 addi
少两个操作数等等
2.noDescendSequence
思路:本题不涉及时序逻辑,直接取 data
的对应位进行比较即可。一行代码我就不贴出来了(
3.tetris
思路
第一步也是最重要的一步,确定状态机类型。一时不慎,满盘皆输!!!
方块的摆放情况数为 8 位二进制数的数量 \(2^8\),再考虑每次独热码输入有 8
种,有效的状态转移真值表共约 \(8 \times 2^8\)
行,再考虑到无效的状态转移行,故采用真值表刻画状态转移的方式应该不是题目意图
(当然如果你毅力超群,我致以崇高敬意)。我采取的方案是用当前的方块摆放情况表示状态,在
Mealy 状态机的输出模块再转换成 output[1:0]
放置方块的行为让我联想到二进制的按位运算。判断某位是否已有方块,只需将输入和当前方块按位与,结果非 0 即为无效放置。而更新状态,只需将输入和当前方块放置状态按位或,注意特判放满后清空即可。
Tips
注意到 logisim 中寄存器初值为 0,所以不用进行寄存器的初始化。
注意判断复位方式是同步复位还是异步复位。异步复位在 logisim 中的实现较为简单。
此外,注意判断时钟是输入还是自带信号。
还有一件事
(成龙历险记老爹音),题目要求的电路外观不同于三输入一输出的默认外观,只需将左边三输入向下移动一格即可,外观的线不是很重要。如果你跟我一样强迫症,那挪一下也不是不行
电路外观如图(已隐去部分内容)
状态转移如图(已隐去部分内容)
输出模块如图(已隐去部分内容)
最后,祝大家上机顺利,学有所获!