//flood Fill 알고리즘
bool MapIsFullyAccessible(bool[,] obstacleMap, int currentObstaclecount) {
//값들 초기화
bool[,] mapFlags = new bool[obstacleMap.GetLength(0), obstacleMap.GetLength(1)];
mapFlags[mapCenter.x, mapCenter.y] = true;
int accessibleTileCount = 1;
//중심점으로 초기화.
Queue<Coord> queue = new Queue<Coord>();
queue.Enqueue(mapCenter);
//queue의 갯수가 0이상이 될때까지 무한 반복.
while(queue.Count > 0) {
//중심점을 기준으로
Coord tile = queue.Dequeue();
// 상하좌우 비교.
for(int x = -1; x<=1; x++) {
for (int y = -1; y <= 1; y++) {
int neighbourX = tile.x + x;
int neighbourY = tile.y + y;
// 대각선 방향은 제외시키기
if (x ==0 || y == 0) {
//맵 크기 이상의 값을 비교하지않도록 막기.
if (neighbourX >= 0 && neighbourX < obstacleMap.GetLength(0) && neighbourY >= 0 && neighbourY < obstacleMap.GetLength(1)){
// 비교하는 위치가 빈값이면 패스
// 장애물이 없으면 접근할 수 있으므로 true로 바꾸고 true한 지점부터 다시 검색하기.
if(!mapFlags[neighbourX, neighbourY] && !obstacleMap[neighbourX, neighbourY]) {
mapFlags[neighbourX, neighbourY] = true;
queue.Enqueue(new Coord(neighbourX, neighbourY));
accessibleTileCount++;
}
}
}
}
}
}
//접근가능한 장애물이 얼마나 존재하는가
int targetAccessibleTilecount = (int)(mapSize.x * mapSize.y - currentObstaclecount);
//접근가능한 총 타일수와 카운트된 접근가능한 타일수가 같다면 True반환.
return targetAccessibleTilecount == accessibleTileCount;
}
PS. 어렵다.. 근데 재미있다 하악하악.
반응형