📅  最后修改于: 2023-12-03 15:12:45.842000             🧑  作者: Mango
本题为浙江大学计算机科学与技术专业门类必修课程《计算机组成原理》中期末考试题目,属于基础部分。
现有一个 n 位门电路,每个门都是一个逻辑运算电路,由若干个逻辑运算器件构成。设第 i 个门的输入端口数为 a_i,输出端口数为 b_i,则第 i 个门的逻辑运算可以表示为如下 a_i 行 b_i 列的矩阵,其中矩阵的第 i 行 j 列表示第 i 个输入端口与第 j 个输出端口之间的逻辑关系。矩阵中第 i 行 j 列上的数 j_i 表示第 i 个输入端口的第 j 个输出信号对第 j 个输出端口的第 j_i 个输入信号的逻辑运算方式。运算方式有三种,分别为 1(或), 2(与), 3(非)。需将该门电路转化成一个由若干个基本运算器件组成的电路,其中基本运算器件只有两个输入端口和一个输出端口,且只能表示三种逻辑运算方式中的一种:与、或或非。
现请你编写一个程序,该程序首先将给定门电路分解成由若干个基本运算器件组成的电路,并输出所需基本运算器件的最小数量。若基本运算器件需要与非或同时存在,则从数量最小的开始考虑;若有多组解,输出任意一组均可。
第一行包含整数 n。
第二行包含 n 个整数,其中第 i 个整数表示第 i 个门的输入端口数 a_i。
接下来 n 行,每行描述一个门。其中第 i 行的第一个数 b_i 表示第 i 个门的输出端口数,接下来 b_i 行表示这个门的一个逻辑运算矩阵。每行由 b_i 个整数组成,分别表示该门的一个输出端口到输入端口的逻辑运算方式,其中 1 表示或,2 表示与,3 表示非(注意逆波兰表示法)。
输出一个整数,表示转换成基本运算器件所需的最小数量。
3
1 2 1
2 2 3
1 2 2
5
在样例中,第一个门的逻辑运算可以表示为:
a|b
c|d
其中 | 表示或运算。我们可以将其表示为:
a | b = s1
c | d = s2
s1 | s2 = o
其中 s1 和 s2 表示两个二输入门的输出信号,o 表示或运算的结果。
第二个门的逻辑运算可以表示为:
a & b
!b
我们可以将其表示为:
a & b = s3
!b = s4
!s4 = s5
s3 | s5 = o
其中 s3、s4、s5 表示三个二输入门的输出信号,o 表示或运算的结果。
第三个门的逻辑运算可以表示为:
a & b
c & d
我们可以将其表示为:
a & b = s6
c & d = s7
s6 & s7 = o
其中 s6、s7 表示两个二输入门的输出信号,o 表示与运算的结果。故最终需要 5 个基本运算器件。
由于门电路比较大,读入使用 cin 在测例 #10-#15 时可能会超时,请使用快速读入方式。