Huawei ODマシンテスト - ロボット迷路

 質問の説明

ロボットは迷路の x と y が与えられた迷路 (x*y 迷路) を歩き、迷路の中に障害物があります。k と入力すると障害物が k 個あることを意味し、障害物の座標が 1 つずつ入力されます。ロボットは
0,0 から x, y の位置まで開始し、x と y が増加する方向にのみ進むことができ、戻ることはできません。
コードのコメントに示されているように、# は歩行可能な正方形を表し、0 は歩行可能な正方形を表します。障害物がある場合、ロボットは 0, 0 から開始します 位置は出口に向かって下または前にのみ移動できます。
到達できないマス目とトラップマスがあります。到達できないマス目は、ロボットが到達できない 4 行目の最初の 3 つです。 、トラップマスは最初の行の最後の 2 つのマス目のようなもので、入った後に最後まで到達することはできません。
要件: トラップと到達できないマス目の数を出力します。

1. 部屋は X*Y の正方形で構成されています。たとえば、下の写真のサイズは 6*4 です。それぞれは座標 (x, y) で記述されます
2. ロボットは四角形 (,) から開始し、東または北にしか移動できません. 出口は四角形 (5,3) に示すように部屋の北東の角に固定されています)。このユースケースでは、ロボットが入り口から出口まで歩けることを保証します。
3. 部屋内のいくつかのマス目は、ロボットが通過できない壁 (4,1) などです。
4. B のマス目など、一度到達すると到達できない場所があり、トラップマスと呼ばれます。
5. A のマス目など、ロボットが到達できない場所があり、アクセス不可と呼ばれます。 . 到達可能なマスと到達不可能なマスには壁の位置は含まれません 6. 下の例の写真では、トラップマスが 2 つ、到達不能マスが 3 つあります。
7. ロボットの経路計画 Q 機能を実装してください。部屋のサイズと壁の位置を考慮して、トラップ マスと到達不可能なマスがいくつあるかを計算してください。

コード

# coding:utf-8
"""
@Date   :2023/7/22
@Title  :机器人走迷宫
@discript:https://dream.blog.csdn.net/article/details/128986089
"""


def robotWalkMaze(x, y, obs):
    dp = [['#'] * y for _ in range(x)]

    # 把墙壁坐标对应的结果标记为0
    for ob in obs:
        i, j = ob
        dp[i][j] = 0

    def dfs(x_, y_):
        if x_ == x - 1 and y_ == y - 1:  # 如果坐标等于出口位置,返回路线可用,标记1
            dp[x_][y_] = 1
            return 1
        elif x_ >= x or y_ >= y or dp[x_][y_] == 0:  # 如果坐标大于等于边界,或者dp中标记为0,即墙壁,这路线标记为-1,不可用
            return -1
        elif dp[x_][y_] != '#':  # 如果当前位置不等于#,即已经被标记过,返回该标记即可
            return dp[x_][y_]
        else:  # 按照深度优先算法先向下走,再向右走
            down = dfs(x_ + 1, y_)
            right = dfs(x_, y_ + 1)
            if down == -1 and right == -1:  # 如果当前位置标记为向下和向右都标记为-1,即说明该位置是陷阱方块
                dp[x_][y_] = -1
            else:
                dp[x_][y_] = max(down, right)  # 位置信息取向下或者向右最大值,其实就是只要有1就ok
            return dp[x_][y_]

    dfs(0, 0)
    r1 = sum(line.count(-1) for line in dp)
    r2 = sum(line.count('#') for line in dp)  # 位置标记没被更新,说明是不可达的方块
    return r1, r2


x, y = map(int, input('X,Y:').split())
obss = []

for _ in range(int(input('N:'))):
    obj = tuple(map(int, input('location:').split(' ')))
    obss.append(obj)

c1, c2 = robotWalkMaze(x, y, obss)
print(c1, c2)

おすすめ

転載: blog.csdn.net/SD_JZZ/article/details/132666722