백준/완전 탐색

[백준 14620번 / C++] 꽃길

배발자 2022. 1. 25.
반응형

완전 탐색 문제이다. 

 

1. dfs 구현은 동일 

2. 현재 지점에서 상하좌우를 돌아봤을 때 맵을 초과했거나 또는 이미 만개한 꽃잎과 겹치는 부분이 있을 경우 continue

3. 위의 조건을 통과하였다면 현재위치 포함 상하좌우 모두 visited 라는 배열에 저장 후 dfs 호출 

4. dfs 호출 이후 코드는 visited 배열을 다시 0으로 초기화. (다른 지역에서 꽃이 필 경우도 모두 탐색해야하기 때문) 

#include <iostream>
#include <algorithm>
#include <climits>
int dx[4] = { 0,0,-1,1 }; 
int dy[4] = { -1,1,0,0 }; 
int n; 
int map[10][10]; 
int visited[10][10]; 
int result = INT_MAX; 
using namespace std; 
void dfs(int sum, int cnt) {
	if (cnt == 3) {
		result = min(result, sum); return; 
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int check = 0; 
			int nx, ny; 		
			for (int k = 0; k < 4; k++) {
				nx = j + dx[k]; 
				ny = i + dy[k]; 
				if (nx < 0 || nx >= n || ny < 0 || ny >= n)continue; 
				if (visited[ny][nx])continue; 
				check++; 
			}
			if (check == 4) {
				int ssum = map[i][j]; 
				for (int k = 0; k < 4; k++) {
					nx = j + dx[k];
					ny = i + dy[k];
					visited[ny][nx] = 1; 		
					ssum += map[ny][nx]; 
				}
				visited[i][j] = 1;
				sum += ssum; 
				cnt++; 
				dfs(sum, cnt); 
				sum -= ssum; 
				cnt--; 
				for (int k = 0; k < 4; k++) {
					nx = j + dx[k];
					ny = i + dy[k];
					visited[ny][nx] = 0;				
				}
				visited[i][j] = 0;
			
			}
		}
	}

}
int main() {
	cin >> n; 
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j]; 
		}
	}
	dfs(0, 0);
	cout << result; 
}

 

 

14620번: 꽃길

2017년 4월 5일 식목일을 맞이한 진아는 나무를 심는 대신 하이테크관 앞 화단에 꽃을 심어 등교할 때 마다 꽃길을 걷고 싶었다. 진아가 가진 꽃의 씨앗은 꽃을 심고나면 정확히 1년후에 꽃이 피므

www.acmicpc.net

 

반응형

'백준 > 완전 탐색' 카테고리의 다른 글

[백준 2529번 / C++] 부등호  (0) 2022.02.19
[백준 1107번 / C++] 리모컨  (0) 2022.02.14
[백준 14502번 / C++] 연구소  (0) 2022.01.28
[백준 1189번 / C++] 컴백홈  (0) 2022.01.25
[백준 2589번 / C++] 보물섬  (0) 2022.01.14

댓글