You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.9 KiB
138 lines
3.9 KiB
2 years ago
|
import queue
|
||
|
|
||
|
q = queue.Queue()
|
||
|
valves = {}
|
||
|
valvesConsider = {}
|
||
|
destinationQue = queue.Queue()
|
||
|
shortest = None
|
||
|
distanceMap = {}
|
||
|
|
||
|
class Valve():
|
||
|
def __init__(self, flowRate, tunnels, name):
|
||
|
self.flowRate = flowRate
|
||
|
self.tunnels = tunnels
|
||
|
self.name = name
|
||
|
|
||
|
def getFlowrate(self):
|
||
|
return self.flowRate
|
||
|
|
||
|
def moves(self, destination, length):
|
||
|
global shortest
|
||
|
if shortest is not None and length >= shortest:
|
||
|
return
|
||
|
if self.name == destination:
|
||
|
if shortest is None or length <= shortest:
|
||
|
shortest = length
|
||
|
return
|
||
|
_length = length + 1
|
||
|
for val in self.tunnels:
|
||
|
destinationQue.put((val, destination, _length))
|
||
|
|
||
|
|
||
|
|
||
|
def step(position1, position2, busy1, busy2, currentTime, pressure, _valvesCons):
|
||
|
global curentbest
|
||
|
done = False
|
||
|
if pressure > curentbest:
|
||
|
print(1)
|
||
|
curentbest = pressure
|
||
|
if len(_valvesCons) == 0:
|
||
|
return
|
||
|
if busy1 == 0:
|
||
|
for destination in _valvesCons:
|
||
|
_CopyCons = _valvesCons.copy()
|
||
|
_dist = distanceMap[(position1, destination)]
|
||
|
if (currentTime + _dist + 1) >= 26:
|
||
|
continue
|
||
|
_busy1 =_dist + 1
|
||
|
_pressure = pressure + ((26 - currentTime - _busy1)* _CopyCons[destination])
|
||
|
_CopyCons.pop(destination)
|
||
|
done = True
|
||
|
q.put((destination, position2, _busy1, busy2, currentTime, _pressure, _CopyCons))
|
||
|
if done:
|
||
|
return
|
||
|
if busy2 == 0:
|
||
|
for destination in _valvesCons:
|
||
|
_CopyCons = _valvesCons.copy()
|
||
|
_dist = distanceMap[(position2, destination)]
|
||
|
if (currentTime + _dist + 1) >= 26:
|
||
|
continue
|
||
|
_busy2 =_dist + 1
|
||
|
_pressure = pressure + ((26 - currentTime - _busy2)* _CopyCons[destination])
|
||
|
_CopyCons.pop(destination)
|
||
|
q.put((position1, destination, busy1, _busy2, currentTime, _pressure, _CopyCons))
|
||
|
return
|
||
|
_currentTime = currentTime + 1
|
||
|
_busy1 = busy1 - 1
|
||
|
_busy2 = busy2 - 1
|
||
|
_CopyCons = _valvesCons.copy()
|
||
|
if _currentTime >= 26:
|
||
|
return
|
||
|
q.put((position1, position2, _busy1, _busy2, _currentTime, pressure, _CopyCons))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def distance(position, destination):
|
||
|
global destinationQue
|
||
|
global shortest
|
||
|
shortest = None
|
||
|
destinationQue.put((position, destination, 0))
|
||
|
while not destinationQue.empty():
|
||
|
_position, _destination, length = destinationQue.get()
|
||
|
valves[_position].moves(_destination, length)
|
||
|
return shortest
|
||
|
|
||
|
openvalves = []
|
||
|
|
||
|
|
||
|
with open('input16.txt','r') as f:
|
||
|
inp = f.read().splitlines(keepends=False)
|
||
|
|
||
|
for line in inp:
|
||
|
tempA, tempB = line.split(' has flow rate=')
|
||
|
_valve = tempA[-2:]
|
||
|
tempB = tempB.replace('; tunnel leads to valve ','; tunnels lead to valves ')
|
||
|
flowRate, tempA = tempB.split('; tunnels lead to valves ')
|
||
|
flowRate = int(flowRate)
|
||
|
tunnels = tempA.split(', ')
|
||
|
if flowRate == 0:
|
||
|
openvalves.append(_valve)
|
||
|
else:
|
||
|
valvesConsider[_valve] = flowRate
|
||
|
newValve = Valve( flowRate, tunnels, _valve)
|
||
|
valves[_valve] = newValve
|
||
|
|
||
|
n = 0
|
||
|
|
||
|
for start in valvesConsider:
|
||
|
n += 1
|
||
|
distanceMap[('AA', start)] = distance('AA', start)
|
||
|
print(n)
|
||
|
for end in valvesConsider:
|
||
|
if (start, end) in distanceMap:
|
||
|
continue
|
||
|
n += 1
|
||
|
_dist = distance(start, end)
|
||
|
distanceMap[(start, end)] = _dist
|
||
|
distanceMap[(end, start)] = _dist
|
||
|
print(n)
|
||
|
|
||
|
|
||
|
for i in distanceMap:
|
||
|
print(i, distanceMap[i])
|
||
|
|
||
|
position = 'AA'
|
||
|
currentTime = 0
|
||
|
pressure = 0
|
||
|
curentbest = 0
|
||
|
q.put((position, position, 0, 0, currentTime, pressure, valvesConsider))
|
||
|
|
||
|
while not q.empty():
|
||
|
print(q.qsize())
|
||
|
position1, position2, busy1, busy2, currentTime, pressure, _valvesConsider = q.get()
|
||
|
step(position1, position2, busy1, busy2, currentTime, pressure, _valvesConsider)
|
||
|
|
||
|
|
||
|
print(curentbest)
|