猫和老鼠在10×10的方格中运动(如图3-6),例如:
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......
C=猫(CAT)
M=老鼠(MOUSE)
*=障碍物
.=空地
猫和老鼠每秒中走一格,如果在某一秒末它们在同一格中,我们称它们“相遇”。
注意:“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90°。一开始它们都面向北方。
编程计算多少秒以后他们相遇。
s = '*...*...........*......*...*...............*.C....*.....*......*........M......*...*.*.....*.*......'
j = 0
maps = []
for i in range(10):
k = []
for t in s[j:j + 10]:
k.append(t)
j += 10
maps.append(k)
def zx(o): # 转向
o[2] = (o[2] + 1) % 4
o[4] += 1
return o
def pz(o): # 判断是否遇到障碍或到边界
if o[2] == 3:
if o[0] == 0:
o = zx(o)
o[3] += 1
if o[2] == 0:
if o[1] == 9:
o = zx(o)
o[3] += 1
if o[2] == 1:
if o[0] == 9:
o = zx(o)
o[3] += 1
if o[2] == 2:
if o[1] == 0:
o = zx(o)
o[3] += 1
if o[2] == 2:
if maps[o[0]][o[1] - 1] == '*':
o = zx(o)
o[3] += 1
if o[2] == 3:
if maps[o[0] - 1][o[1]] == '*':
o = zx(o)
o[3] += 1
if o[2] == 0:
if maps[o[0]][o[1] + 1] == '*':
o = zx(o)
o[3] += 1
if o[2] == 1:
if maps[o[0] + 1][o[1]] == '*':
o = zx(o)
o[3] += 1
return o
def xd(o): # 行动
if o[2] == 0:
o[1] += 1
o[3] += 1
elif o[2] == 1:
o[0] += 1
o[3] += 1
elif o[2] == 2:
o[1] -= 1
o[3] += 1
elif o[2] == 3:
o[0] -= 1
o[3] += 1
return o
# 移动方向
'''
右移 0
下移 1
左移 2
上移 3
'''
C = [4, 5, 3, 0, 0] # x,y,方向,time,转向次数
M = [7, 2, 3, 0, 0]
while True:
if C[3] == M[3] and C[0] == M[0] and C[1] == M[1]:
break
C = pz(C)
M = pz(M)
if C[4] == 0: # 保持在同一时空,在相同时空下才可再次进行移动
C = xd(C)
else:
C[4] -= 1
if M[4] == 0:
M = xd(M)
else:
M[4] -= 1
print(C[3])