[BOJ/Python]16236号サメ
この問題はBFSを利用して条件に合った空間の中の位置に移動し,二度と移動できなくなるまで繰り返される.答えを探したり、答えを出したりするのに時間がかかったが、多くの問題が得られた.
->n対jを繰り返すfor文.
-->grid[i][j]が9の場合、
----->cur y,cur xをi,jに更新する.
----->grid[i][j]を0に更新します.
句を终える.
->qはdequeです.
->qに(0,cur y,cur x,0)を加えます.
->アクセス処理リストをn*nのサイズとして宣言し、Falseを埋めます.
->アクセスした[cur y][cur x]をtrueに更新します.
->食べられる魚の保存先のリスト結果をリストします.
->qが存在する場合、whileゲートを繰り返します.
-->d,y,x,flgはqから抽出される.
-->システムは最小距離の変数mdを格納する.maxsizeと宣言します.
-->flgが1の場合、dがmd以下の場合、
-->mdをdに更新します.
-->結果に(d,y,x)を加えます.
-->4回繰り返したiに対してfor文を回します.
----->ny,nxをy+dy[i],x+dx[i]に更新する.
-->nyが0より大きく、nより小さく、nxが0より大きく、nより小さく、アクセス[ny][nx]がfalseの場合
------>grid[ny][nx]が0より大きくbabyより小さい場合、
------>アクセスした[ny][nx]をtrueに更新します.
------->qに(d+1,ny,nx,1)を加える.
------>grid[ny][nx]がbabyに等しい場合、またはgrid[ny][nx]が0である場合.
------>アクセスした[ny][nx]をtrueに更新します.
------->qに(d+1,ny,nx,0)を加える.
->結果が空の場合、
-->[1,1,1,1].
->結果を昇順に並べます.
->結果[0]を返します.
->time,cur y,cur xをbfs(cur y,cur x)として格納する.
->[time,cur y,cur x]が[1,1,1,1]に等しい場合、
-->答えを印刷します.
-->while文を閉じます.
回答に時間をかける.
->grid[cur y][cur x]を0と宣言します.
->cnt 1を増やします.
->cntがbabyと同じ場合、
-->baby 1を増やします.
-->cntを0に更新します.
Code import sys
from collections import deque
n=int(input())
grid=[list(map(int, input().split())) for _ in range(n)]
cur_y, cur_x=0, 0
for i in range(n):
for j in range(n):
if grid[i][j]==9:
cur_y, cur_x=i, j
grid[i][j]=0
break
baby=2
dy, dx=[-1, 0, 0, 1], [0, -1, 1, 0]
def bfs(cur_y, cur_x):
q=deque()
q.append((0, cur_y, cur_x, 0))
visited=[[False]*n for _ in range(n)]
visited[cur_y][cur_x]=True
results=[]
while q:
d, y, x, flg=q.popleft()
md=sys.maxsize
if flg==1 and md>=d:
md=d
results.append((d, y, x))
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<n and not visited[ny][nx]:
if 0<grid[ny][nx]<baby:
visited[ny][nx]=True
q.append((d+1, ny, nx, 1))
elif grid[ny][nx]==baby or grid[ny][nx]==0:
visited[ny][nx]=True
q.append((d+1, ny, nx, 0))
if not results:
return [-1, -1, -1]
results.sort(key=lambda x: (x[0], x[1], x[2]))
return results[0]
answer=0
cnt=0
while True:
time, cur_y, cur_x=bfs(cur_y, cur_x)
if [time, cur_y, cur_x]==[-1, -1, -1]:
print(answer)
break
answer+=time
grid[cur_y][cur_x]=0
cnt+=1
if cnt==baby:
baby+=1
cnt=0
Reference
この問題について([BOJ/Python]16236号サメ), 我々は、より多くの情報をここで見つけました
https://velog.io/@xx0hn/BOJ-Python-16236번-아기-상어
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys
from collections import deque
n=int(input())
grid=[list(map(int, input().split())) for _ in range(n)]
cur_y, cur_x=0, 0
for i in range(n):
for j in range(n):
if grid[i][j]==9:
cur_y, cur_x=i, j
grid[i][j]=0
break
baby=2
dy, dx=[-1, 0, 0, 1], [0, -1, 1, 0]
def bfs(cur_y, cur_x):
q=deque()
q.append((0, cur_y, cur_x, 0))
visited=[[False]*n for _ in range(n)]
visited[cur_y][cur_x]=True
results=[]
while q:
d, y, x, flg=q.popleft()
md=sys.maxsize
if flg==1 and md>=d:
md=d
results.append((d, y, x))
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<n and not visited[ny][nx]:
if 0<grid[ny][nx]<baby:
visited[ny][nx]=True
q.append((d+1, ny, nx, 1))
elif grid[ny][nx]==baby or grid[ny][nx]==0:
visited[ny][nx]=True
q.append((d+1, ny, nx, 0))
if not results:
return [-1, -1, -1]
results.sort(key=lambda x: (x[0], x[1], x[2]))
return results[0]
answer=0
cnt=0
while True:
time, cur_y, cur_x=bfs(cur_y, cur_x)
if [time, cur_y, cur_x]==[-1, -1, -1]:
print(answer)
break
answer+=time
grid[cur_y][cur_x]=0
cnt+=1
if cnt==baby:
baby+=1
cnt=0
Reference
この問題について([BOJ/Python]16236号サメ), 我々は、より多くの情報をここで見つけました https://velog.io/@xx0hn/BOJ-Python-16236번-아기-상어テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol