# 输入:第一行房间的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) # 陷阱方格和不可到达数量
28.机器人走迷宫-难点--OD
于 2024-03-24 15:13:51 首次发布