28.机器人走迷宫-难点--OD

# 输入:第一行房间的X Y
# 第2行房间的墙壁个数N
# 接着下面N行分别是墙壁的坐标
# 6 4
# 5
# 0 2
# 1 2
# 2 2
# 4 1
# 5 1
# 输出
# 2 3
# 房间由X*Y方格组成,机器人从(0,0)出发,只能向东或者向北前进,出口固定为房间的东北角,用例保证可以从起点到终点,
# 房间中有墙壁,机器人不能经过,
# 有些地方一旦经过就无法到达终点,称之为陷阱方格
# 按照题意规定的前进方向,有些地方是不可达方格,不可达方格不包括墙壁
# 请计算陷阱方格和不可达方格分别有多少个




def solve_method(x, y, obstacles):
    dp = [["#"] * y for _ in range(x)]
    print('dp=',dp)
    for obstacle in obstacles:
        i, j = obstacle
        dp[i][j] = 0  # 墙壁设为0

    def dfs(x_, y_):
        print('x_, y_',x_, y_)
        if x_ == x - 1 and y_ == y - 1:  # 如果当前位置是终点,则将 dp[x_][y_] 设为 1 并返回 1,表示找到了一条路径到终点。
            dp[x_][y_] = 1
            return 1
        elif x_ >= x or y_ >= y or dp[x_][y_] == 0:  # 如果越界或当前位置是墙壁,则返回 -1,表示当前位置不可达
            return -1
        elif dp[x_][y_] != "#":  # 如果当前位置已经探索过 且不是墙壁,则返回 dp[x_][y_] 的值。
            return dp[x_][y_]
        else:  #
            up = dfs(x_ + 1, y_)
            right = dfs(x_, y_ + 1)
            if up == -1 and right == -1:
                dp[x_][y_] = -1 # 如果向上和向右都不可达则是陷阱
            else:# 取两者中的最大值作为当前位置可达的最大深度,并更新 dp[x_][y_] 的值。
                dp[x_][y_] = max(up, right)
            return dp[x_][y_]

    dfs(0, 0) # 从起点 (0, 0) 开始调用 dfs 函数进行搜索。

    # 计算 dp 数组中所有标记为 -1(陷阱方格)和 "#"(原始墙壁或未探索区域)的数量
    c1 = sum(line.count(-1) for line in dp)
    c2 = sum(line.count("#") for line in dp)
    return c1, c2


x, y = map(int, input().split())
obstacles = []
for _ in range(int(input())):
    obstacle = tuple(map(int, input().split()))
    obstacles.append(obstacle)

c1, c2 = solve_method(x, y, obstacles)
print(c1, c2)  #  陷阱方格和不可到达数量


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值