프로그램 제작자
코드 중심 개발자를 고용하십시오. 배치 기반 위치 매칭. 프로그래머의 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.
Programmer.co.kr
1. 문제
(기입)
게임 보드의 상태를 나타내는 문자열 배열
- . : 비어있는 곳
- D: 장애물
- R: 로봇의 초기 위치
- G: 타겟 포인트
(결과)
말이 목표 위치에 도달하는 데 필요한 최소 이동 수를 반환합니다.
2. 해결
BFS로 해결할 수 있는 문제입니다. 🙂
먼저 검색의 시작점과 끝점을 찾아야 합니다.
startX, startY = 0, 0
targetX, targetY = 0, 0
width, height = len(board(0)), len(board)
for x in range(height):
for y in range(width):
if board(x)(y)=='R': startX,startY = x,y
elif board(x)(y)=='G': targetX,targetY = x,y
보드의 장애물에 부딪힐 때까지 또는 맨 끝에 미끄러지는 자신을 본다면,
빵 부스러기가 겹칠 수 있음을 알 수 있습니다.

위의 그림에서와 같이 A지점의 오른쪽과 B지점의 오른쪽으로 이동하는 목표지점은 동일하며,
특정 지점 P에서 D로 이동할 때 통과 지점을 다시 D로 검색할 필요가 없습니다.
이렇게 하려면 Visited 라는 배열을 추가합니다.
visited = (((False)*4 for _ in range(width)) for _ in range(height))
그런 다음 BFS 알고리즘을 사용하여 검색할 수 있습니다.
3. 코드
파이썬
dx = (-1,0,1,0)
dy = (0,1,0,-1)
def solution(board):
startX, startY = 0, 0
targetX, targetY = 0, 0
width, height = len(board(0)), len(board)
for x in range(height):
for y in range(width):
if board(x)(y)=='R': startX,startY = x,y
elif board(x)(y)=='G': targetX,targetY = x,y
q = ((startX,startY,0))
visited = (((False)*4 for _ in range(width)) for _ in range(height))
while q:
x, y, time = q.pop(0)
if x == targetX and y == targetY:
return time
for d in range(4):
if not visited(x)(y)(d):
visited(x)(y)(d) = True
nx, ny = x+dx(d), y+dy(d)
while 0<=nx<height and 0<=ny<width and board(nx)(ny)!='D':
visited(nx)(ny)(d) = True
nx, ny = nx+dx(d), ny+dy(d)
q.append((nx-dx(d),ny-dy(d),time+1))
return -1