Help us understand the problem. What is going on with this article?

移動が可能かの判定・幅のある移動 Python3編やってみた

問題

マップの行数 H と列数 W ,障害物を # で移動可能な場所を . で表した H 行 W 列のマップ S_1 ... S_H ,現在の座標 sy, sx, 移動の回数 N が与えられます。
プレイヤーははじめ北を向いています。
続けて、 N 回の移動の向き d_1 ... d_N と移動するマス数 l_1 ... l_N が与えられます。
各移動が可能である場合、移動後の y , x 座標 を出力してください。
移動しきれない場合、移動できるところまで移動した後の座標を出力した後に "Stop" を出力して、以降の移動を打ち切ってください。
移動可能であるということは、以下の図の通り
「今いるマスから移動先のマスまでの間の全てのマスが移動可能である かつ 移動先がマップの範囲外でない」 ということを意味します。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

スクリーンショット 2020-08-23 12.03.27.png

移動が可能かの判定・幅のある移動 (paizaランク B 相当)

つまづいた所

"#"が途中で出てくる場合の処理

与えられた数値を元にスライスしたり、numpy使おうとしたり苦戦。
完全に複雑に考えすぎていた。
最終的にfor文で1座標ずつ処理して行った。
もちろん一番最初にfor文を試してはいたが、breakの処理や場所を勘違いしてたり、一分岐ごとにわざわざ出力してたりと遠回りに遠回りに可笑しな方向に行ってしまった。
また、枠からはみ出るかつ、途中で"#"が出てくる場合の処理が抜けていた。

コード

idou_haba.py
h,w,y,x,n = [int(i) for i in input().split()]

board = [list(input()) for i in range(h)]



direction = "N"
stop = False

for i in range(n):
    a,b = input().split()
    b = int(b)
    #北向
    if direction == "N":
        #右方向
        if a == "R":
            direction = "E"
            if x+b >= w:
                for i in range(x,w):
                    x += 1
                    if board[y][x] == "#":
                        x -= 1
                        break
                stop = True

            else:
               for i in range(b):
                   x += 1
                   if board[y][x] == "#":
                       x -= 1
                       stop = True
                       break


        #左方向
        else:
            direction = "W"
            if x - b < 0:
                for i in range(0,x):
                    x -= 1
                    if board[y][x] == "#":
                        x += 1
                        break
                stop = True


            else:
                for i in range(b):
                    x -= 1
                    if board[y][x] == "#":
                        x += 1
                        stop = True
                        break


    #南向き
    elif direction == "S":
        #右方向
        if a == "R":
            direction = "W"
            if x - b < 0:
                for i in range(0,x):
                    x -= 1
                    if board[y][x] == "#":
                        x += 1
                        break
                stop = True





            else:
                for i in range(b):
                    x -= 1
                    if board[y][x] == "#":
                        x += 1
                        stop = True
                        break



        #左方向    
        else:
            direction = "E"
            if x+b >= w:
                for i in range(x,w):
                    x += 1
                    if board[y][x] == "#":
                        x -= 1
                        break
                stop = True

            else:
               for i in range(b):
                   x += 1
                   if board[y][x] == "#":
                       x -= 1
                       stop = True
                       break

    #東向き       
    elif direction == "E":
        #右方向
        if a == "R":
            direction = "S"
            if y + b >= h:
                for i in range(y,h):
                    y += 1
                    if board[y][x] == "#":
                        y -= 1
                        break
                stop = True


            else:
                for i in range(b):
                    y += 1
                    if board[y][x] == "#":
                        y -= 1
                        stop = True
                        break


        #左方向
        else:
            direction = "N"
            if y - b < 0:
                for i in range(0,y):
                    y -= 1
                    if board[y][x] == "#":
                        y += 1
                        break
                stop = True

            else:
                for i in range(b):
                    y -= 1
                    if board[y][x] == "#":
                        y += 1
                        stop = True
                        break
    #西向き
    else:
        #右方向
        if a == "R":
            direction = "N"
            if y - b < 0:
                for i in range(0,y):
                    y -= 1
                    if board[y][x] == "#":
                        y += 1
                        break
                stop = True

            else:
                for i in range(b):
                    y -= 1
                    if board[y][x] == "#":
                        y += 1
                        stop = True
                        break


        #左方向
        else:
            direction = "S"
            if y + b >= h:
                for i in range(y,h):
                    y += 1
                    if board[y][x] == "#":
                        y -= 1
                        break
                stop = True


            else:
                for i in range(b):
                    y += 1
                    if board[y][x] == "#":
                        y -= 1
                        stop = True
                        break

    if stop == True:
        print(y,x)
        print("Stop")
        break

    else:
        print(y,x)

結果

スクリーンショット 2020-08-23 12.27.39.png

与えられる入力を全て開いてるのが試行錯誤の跡。
一回諦めたけど悔しくて悔しくて笑
東西南北と右左で8通りの分岐はあるものの、結局は4パターンの処理なので思考的な負荷はコードの半分くらい。

向き合って正解でした🙆‍♂️

orenagato
未経験勉強中。 今のところ有益な記事を書くと言うよりも、自分の思考やつまづいたりした部分の記録用兼モチベーション用ツールとして使っています。 自分の拙いコードが世に出るのは恥ずかしいですが気にせずアップしていきます。 主にPaizaでトレーニング中。 至らない所だらけですがお手柔らかにお願いします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした