import re
cases = (
"COXXXXXOXXXXXXOXXXXXXXOXXXXXOOXXXXXXXOXXXXXXXXOXXOXXXXXXXOXXXXXXOXOXXXXXXXOXXXXXXXOXXXXXXOXXXOOXXXXOXXXXXXXOXXXXXXOXXXXXXOXXXXXXOXXXXXXXOXXXXXOXXXXXXXOXXXXXOXOXXXXOXXOXXXXXXXXOOXXXXXXXXOXXXXXXXOXXXXXXXOXXXXXXXOXXXXXXOXXXXOXXXXXXXOXXXXXOXXXXXXXXOXXXXXXXOXXXXXOXXXXXXXXOXXXXXXXXOXXXXXXXXOOXXXXXXOXXXXXOXXXOXXXXXOXXXXXXOXXXXXXOXXXXXXXOXXXXXXXXOXXXXXXXOXXXXXXXXOXXXXXXOXOXXXXOXXXXXXOXXXXXOXXXXXXXOXXXXXOXXXOXXXXXOXXXXXOXXXXXXXOXXXXXXXOOXXXXXXOXXXXXXXOXXXXXXOXXXXXXXOXXXXXOXXXXXXOXXXXXXOXXXXXXXOXXXXXXXXOXXXXXOXXXXXXOXXXXXXOXXXXXXXXOXXXXXXXOXOXXXXXXXOXXXXXXXOOXXXXXOXXXXXXXOXXXXXXXXOXXXXXXXOXXXXXXOXXXXXXXOXXXXXXXXOXXXXXXXXOXXOXXXXXXXXOXXXXXOXXXXXXXXOXXXXXXXOXXXXXXXXO",
)
answers = (0, 0, 0, 2, 2, 0, 15, 0, 2, 14, 4, 15, 5, 10, 7, 11)
def next_pos(st, pos):
ps = []
n = len(st)
i = pos + 1
while i < n and st[i] == '.':
i += 1
if i < len(st) and st[i] in 'OX':
i += 1
while i < n and st[i] == '.':
# ps.append(i)
i += 1
if st[i - 1] == '.':
ps.append(i - 1)
if i < n and st[i] == 'X':
ps.append(i)
j = pos - 1
while j >= 0 and st[j] == '.':
j -= 1
if j >= 0 and st[j] in 'OX':
j -= 1
while j >= 0 and st[j] == '.':
# ps.append(j)
j -= 1
if st[j + 1] == '.':
ps.append(j + 1)
if j >= 0 and st[j] == 'X':
ps.append(j)
return ps
def cannon_attack(st, pos=0):
st = '.' + st[1:]
print(re.split(r"(O+)", st))
i = st.find('OO')
if i != -1:
st = st[:i]
print(i)
q = [(st, 0)]
visited = set([st])
max_pos = 0
print("init :", st)
while len(q) > 0:
s, _p = q.pop(0)
max_pos = max(max_pos, _p)
ps = next_pos(s, _p)
for p in ps:
ns = s[:p] + '.' + s[p + 1:]
if not ns in visited:
visited.add(ns)
q.append((ns, p))
print(max_pos)
return max_pos
for st in cases:
cannon_attack(st)
To embed this program on your website, copy the following code and paste it into your website's HTML: