카테고리 없음

Flood Fill 알고리즘을 이용한 상하좌우 접근가능 체크

zelkova 2021. 2. 14. 12:11

<목차로 돌아가기>

 

 

   //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. 어렵다.. 근데 재미있다 하악하악.

 

 

 

반응형