나는 타일 맵을 사용하는 게임을하고 있습니다. 지도의 사각형은 벽이거나 비어있을 수 있습니다. 내가 개발하려고하는 알고리즘은지도에서 한 지점을 가져 와서 해당 지점에서 도달 할 수있는 셀의 수를 반환해야합니다 (지점을 포함하는 섹터의 영역과 같습니다).사각형 격자에서 영역의 면적을 계산하기위한 알고리즘
알고리즘을 수행하는 함수가 2 차원 배열의 형태로 x 좌표, y 좌표 및 맵을 사용한다고합시다.
function sectorArea(x_coord,y_coord,map) { ... }
는 (의 벽을 나타내는 경우 1)지도는 다음과 같습니다 말 :
map = [0,0,1,0,0,0],
[0,0,1,0,0,0],
[1,1,1,0,0,0],
[0,0,0,0,0,0]
그런 sectorArea(0,0,map) == 4
및 sectorArea(4,0,map) == 15
을.
내 순진 구현은 재귀 적입니다. 대상 셀은 go
함수에 전달되며,이 함수는 비어있는 모든 인접 셀을 반복하여 결국 섹터의 모든 빈 셀에 퍼집니다. 실행 속도가 너무 느리고 호출 스택 제한에 도달하는 속도가 매우 빠릅니다.
function sectorArea(x_coord,y_coord,map) {
# First convert the map into an array of objects of the form:
# { value: 0 or 1,
# visited: false }
objMap = convertMap(map);
# The recursive function:
function go(x,y) {
if (outOfBounds(x) || outOfBounds(y) ||
objMap[y][x].value == 1 || objMap[y][x].visited)
return 0;
else
objMap[y][x].visited = true;
return 1 + go(x+1,y) + go(x-1,y) + go(x,y+1) + go(x,y-1);
}
return go(x_coord,y_coord);
}
더 좋은 알고리즘을 제안 할만한 사람이 있습니까? 비 결정적 솔루션은 속도가 주요 쟁점 (알고리즘은 단일 틱 동안 다른 지점에서 3 ~ 4 번 호출 될 수 있기 때문에)이 정확하면 실제로는 괜찮습니다.