📅  最后修改于: 2023-12-03 15:12:47.721000             🧑  作者: Mango
这是一个有趣的问题,需要Simulator的帮助来解决。Simulator是一个模拟器,它能够模拟门电路的行为。
给出$m$个门和$n$个输入信号,在$t$个时钟周期内,计算输出信号的值。
对于每个门和输入信号,给出它们的ID和初始值。对于每个门,给出它的类型(AND、OR或NOT),输入端口的ID和输出端口的ID。
注意,门可以有多个输入端口和/或输出端口。
输出门的ID为0。输出信号的值是在所有时钟周期内计算的。
你可以假设门电路在第一个时钟周期的初始状态是已经稳定的。将输入信号的值传递到输出门可以使用Dijkstra算法的变体。
模拟电路的行为需要记录电路中每个门的状态。我们可以对每个门都建立一个状态机来实现对其状态的记录。
当一个输入信号改变时,我们需要更新与之连接的所有门的状态。这可以使用Dijkstra的变体算法来实现。正常的Dijkstra算法是找到从一个节点到另一个节点的最短路径。在这个问题中,我们需要找到从输入端口到输出端口的最短路径。在找到最短路径后,我们需要更新路径中所有的门的状态。
当所有的输入信号都已经稳定下来时,我们需要进行多个时钟周期的模拟。在每个时钟周期中,我们根据每个门的类型,计算其输出,并更新其状态。当所有门的状态都已更新之后,我们可以得到输出门的值。
以下是用Python实现以上算法的示例代码:
import heapq
class Gate:
def __init__(self, _id, _type, inputs, outputs):
self.id = _id
self.type = _type
self.inputs = inputs
self.outputs = outputs
self.state = 0
self.next_state = 0
class Signal:
def __init__(self, _id, _value):
self.id = _id
self.value = _value
self.last_changed = -1
class Simulator:
def __init__(self, gates, signals):
self.gates = gates
self.signals = signals
self.outputs = []
self.schedule = []
self.clock = 0
for gate in gates:
self.schedule.append((0, gate))
heapq.heapify(self.schedule)
def run(self, num_cycles):
for i in range(num_cycles):
while self.schedule[0][0] == self.clock:
event = heapq.heappop(self.schedule)
gate = event[1]
gate.state = gate.next_state
if gate.id == 0:
self.outputs.append(gate.state)
continue
for output in gate.outputs:
heapq.heappush(self.schedule, (self.clock + 1, output))
self.clock += 1
for signal in self.signals:
if signal.value != signal.last_changed:
signal.last_changed = signal.value
for gate in signal.outputs:
heapq.heappush(self.schedule, (self.clock, gate))
for gate in self.gates:
inputs = [input.state for input in gate.inputs]
if gate.type == 'AND':
gate.next_state = int(all(inputs))
elif gate.type == 'OR':
gate.next_state = int(any(inputs))
elif gate.type == 'NOT':
gate.next_state = int(not inputs[0])
def set_signal(self, signal_id, value):
signal = self.signals[signal_id]
if signal.value != value:
signal.value = value
for gate in signal.outputs:
heapq.heappush(self.schedule, (self.clock, gate))
def main():
m, n, t = map(int, input().split())
gates = []
signals = []
for i in range(m):
gate_data = input().split()
inputs = []
outputs = []
for j in range(5, len(gate_data)):
if gate_data[j][0] == 'I':
input_id = int(gate_data[j][1:])
input_signal = None
for signal in signals:
if signal.id == input_id:
input_signal = signal
if not input_signal:
input_signal = Signal(input_id, int(gate_data[j + 1]))
signals.append(input_signal)
inputs.append(input_signal)
if input_signal not in input_signal.outputs:
input_signal.outputs.append(input_signal)
else:
output_id = int(gate_data[j][1:])
output_gate = None
for gate in gates:
if gate.id == output_id:
output_gate = gate
if not output_gate:
output_gate = Gate(output_id, gate_data[0], [], [])
gates.append(output_gate)
outputs.append(output_gate)
if output_gate not in output_gate.inputs:
output_gate.inputs.append(output_gate)
gate = Gate(int(gate_data[1]), gate_data[0], inputs, outputs)
gates.append(gate)
simulator = Simulator(gates, signals)
for i in range(n):
signal_data = input().split()
signal_id = int(signal_data[1])
signal_value = int(signal_data[2])
simulator.set_signal(signal_id, signal_value)
simulator.run(t)
for output in simulator.outputs:
print(output)
if __name__ == '__main__':
main()
以上就是解决门|门模拟 2017 |问题 19的一个思路和示例代码。