본문 바로가기
C++ STL, 알고리즘

DFS 활용 Flood Fill

by wanna_dev 2023. 10. 24.

입력 

5

0 0 0 0 0

0 0 0 1 1

0 0 0 1 0

1 1 1 1 0

0 0 0 0 0

1 1 3

 

<출력>

3 3 3 3 3

3 3 3 1 1

3 3 3 1 0

1 1 1 1 0

0 0 0 0 0

 

 

 

0은 빈공간 1은 경계선 1,1은 색칠하고자 하는 위치 3은 칠할 숫자

 

 

struct Point{
	int row, col;
}

int D[4][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} }; //상하좌우
int N, Board[MAX_N][MAX_N];

int main(){
	cin >> N;
    for(int i =0; i<N; i++){
    	for(int j=0; j<N; j++){
        	cin >> Board[i][j];
         }
     }
     
     int sr, sc, color;
     cin >> sr >> sc >> color;
     dfs(sr, sc, color);
     
     for(int i =0; i<N; i++){
    	for(int j=0; j<N; j++){
        	cout << Board[i][j] << ' ';
         }
         cout << endl;
     }    
     return 0;
     
 }
void dfs(int r, int c, int color) { //r,c : 시작위치
	bool visited[MAX_N][MAX_N] = {false}; //하나하나에 대해서 방문여부
    stack<Point> mystack;
    mystack.push({r,c});
    
    while(!mystack.empty()){
    	Point curr = mystack.top();
        mystack.pop();
        if(visited[curr.row][curr.row])continue;
        
        visited[curr.row][curr.col] = true;
        Board[curr.row][curr.col] = color;
        
        for(int i =0; i<4; i++){ //상하좌우
        	int nr = curr.row + D[i][0], nc = curr.col+D[i][1];
            if(nr < 0 || nr > N-1 || nc <0 || nc >N-1) continue; //경계 값 검사
            if(visited[nr][nc]) continue; 
            if(Board[nr][nc] == 1) continue;
            mystack.push({nr, nc});
        }
     }
 }

https://www.youtube.com/watch?v=M48Po-wTOpU

 

'C++ STL, 알고리즘' 카테고리의 다른 글

BFS, DFS 활용 문제 고찰  (0) 2023.11.01
c++ memset  (0) 2023.10.24
BFS, DFS c++  (0) 2023.10.23
c++ lower_bound upper_bound  (0) 2023.10.13
float vs double c++ 부동소수점 문제  (0) 2023.10.12