[伯俊]10157プレースホルダpython


座席を割り当てる


質問する


ある公演会場は横にC席、縦にR席、C席がございます×R格子型配置.各座席の番号は、対応するグリッドの座標(x,y)で表される.
例を挙げる.下図は横7席、横6席の7席です.×6マスシートのレイアウトが展示されています.図中の各単位矩形は、個別の座席を表し、表示される値(x,y)は、座席の番号を表す.一番左下の座席番号は(1,1)、一番右上の座席番号は(7,6)です.
(1, 6)(7, 6)(4, 4)(7, 4)(1, 3)(6, 3)(1, 2)(1, 1)(2, 1)(3, 1)(7, 1)
この劇場に入るためにたくさんの人が並んで待っています.待っている人は一番前から1.2.3.4順番に待機番号表を受け取りました.並んでいる人には、(1,1)席から時計回りに回り、観客を順番に空いている席に配置します.これをもう少し具体的に説明すると以下の通りです.
まず、1人目、すなわち待機番号1の人を座席(1,1)に割り当てる.そして上方向の席に上がって、次のグループを手配します.これ以上上の席が空いていなければ、右に行って手配します.右側に空席がなければ下へ行きます.そして、下に席がない場合は左に行き、残りの空席を割り当てます.その後、左側に空席がない場合は、再び上に配置し、すべての席が配置されるまでこの手順を繰り返します.
下図7×6劇場では、1番から42番までの観客が座席の手配の結果を展示している.
678910111252627282930134253839403114324374241321522336353433161222120191817
公演場所の大きさを表す自然数CとRを与えたとき、Kの順番を待つ観客の座席番号(x,y)を見つけるプログラムを書くべきだ.

入力


1行目では,演出場のメッシュサイズを表す整数CとRが空白を隔てて順次与えられる.2つの値の範囲は5≦C,R≦1000であった.次の行は、ある観客の待機番号Kを与える.1≦K≦10000000しかありません.

しゅつりょく


入力プロンプトとして待機番号Kの視聴者に割り当てられた座席番号(x,y)を要求し、2つの値xとyを1つのスペースだけ離して印刷する.すべての席が手配され、対応する待機番号の観客に席を手配できない場合は、0(数字ゼロ)を出力します.

解決策

  • 4方向を考慮して、彼らを前進させてバックさせ、問題を解決した.
  • が私の位置に着いてから終わり、壁にぶつかるまでその方向に進む番組.
  • C,R = map(int,input().split())
    
    my_seat = int(input())
    
    #좌석을 줄 수 없는 경우 
    if my_seat > C*R :
        print(0)
        exit()
    
    #4방향 
    dx = [0,1,0,-1]
    dy = [-1,0,1,0]
    
    #그리드 만들기 
    grid = [[0]*C for _ in range(R)]
    direction = x= y = 0
    
    #행렬 돌면서 
    for seat in range(1,C*R+1) :
        #내자리면 끝내기 
        if seat == my_seat:
            print(y+1,x+1)
            break
        else :
            #표시하고 
            grid[x][y] = seat
            #앞으로 전진 
            x += dx[direction]
            y += dy[direction]
    
            if x<0 or y<0 or x>=R or y>=C or grid[x][y]:
                x -= dx[direction]
                y -= dy[direction]
                #범위 벗어나면 뒤로 뺐다가 방향 바꿔서 전진 
                direction = (direction+1)%4
                x += dx[direction]
                y += dy[direction]