LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

問題

マップの行数 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パターンの処理なので思考的な負荷はコードの半分くらい。

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0