蓝桥杯试题 算法提高 Cat And Mouse

 猫和老鼠在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])

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值