dfs : 음료수 얼려 먹기2

·2022년 5월 25일
0

이코테_알고리즘

목록 보기
16/23

풀이 전략

  1. 0인 부분을 어쨋든 모두다 탐색을 해야 하므로 , dfs로 접근하자.
  2. dfs가 한번 호출된다면, 해당 dfs 함수에서 0인 부분을 확인해서
    재귀형태로 dfs를 호출하는 방식으로
  3. dfs가 종료되는 부분은 상하좌우 칸씩을 확인하면서, 조건에 만족하지 않을 때 함수를 뛰쳐나옴.

알아야 할 것들

  1. 여러자리수로 입력되는 것을 한자리로 받기
    : 내 벨로그에 있음.
  2. 2차원 벡터에 입력되는 값 넣어서 크기 할당하기
    : 내 벨로그에 있음.

코드


#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <iostream>
#include <list>
#include <algorithm>

//필요한 것들
// 한 자리씩 받기
// 2차원벡터에 넣기 

bool dfs(int _x, int _y, vector<vector<int>>&_v)
{
	// 0 인부분만 파고 들자. 
	// 그러다가 0이 아닐 경우에는 카운팅을 하고 뛰쳐 나오자. 

	// 인덱스 확인하는 부분.
	if (_x < 0 || _x >= _v.size()
		|| _y < 0 || _y >= _v[0].size())
		return false;

	if (_v[_x][_y] == 1)
		return false;

	//외부에서 카운팅을 돌려서 콜되는 순간만 카운팅을 하자. 
	if (_v[_x][_y] == 0)
	{
		_v[_x][_y] = 1;
		
		// 상 하 좌 우 확인하는 방법으로 접근하자.
		dfs(_x, _y + 1, _v);
		dfs(_x, _y - 1, _v);
		dfs(_x + 1, _y, _v);
		dfs(_x - 1, _y, _v);
	}

	return true;
}


int main()
{
	int n, m;
	cin >> n >> m;

	vector<vector<int>>v(n, vector<int>(m,0));

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%1d", &v[i][j]);
		}
	}

	int cnt{ 0 };
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (dfs(i, j, v))
			{
				++cnt;
			}
		}
	}
	
	cout << cnt;
}


profile
🔥🔥🔥

0개의 댓글