Closed Jewan1120 closed 1 week ago
boolean check(int r, int c)
: (r, c)
기준 사방을 탐색했을 때, 꽃잎이 필 수 있는지 확인boolean isValid(int r, int c)
: 꽃잎이 화단의 범위를 벗어나지 않는지void func(int depth, int idx, int cost)
depth
: dfs 깊이idx
: 몇 번째 화단에 심을 것인지에 대한 정보cost
: 씨앗을 심고, 꽃이 필 때 필요한 비용재귀
, 백 트래킹
가능깊이 3의 재귀
+ 백 트래킹
백 트래킹
을 하여 완전 탐색
을 진행
int sum = 0;
for (int j = 0; j < 5; j++) {
int ny = y + dy[j];
int nx = x + dx[j];
visited[ny][nx] = true;
sum += board[ny][nx];
}
// 다음 깊이의 재귀 진행
recursive(depth + 1, total + sum, i + 1);
// 방문 처리를 되돌리는 백 트래킹
for (int j = 0; j < 5; j++) {
int ny = y + dy[j];
int nx = x + dx[j];
visited[ny][nx] = false;
}
=> 완전탐색 가능
x:1~N-1, y=1~N-1
에만 올 수 있음완전탐색
dfs(int depth, int cur, int total)
isEdge(r, c)
: 가장 자리 판단!canPlant(r, c)
: 꽃 피는 5영역 이미 꽃이 있는지 판단plantSeed(int x, int y, boolean flag)
O(N*N*)
소요총 3개의 꽃을 밭에서 벗어나지 않고, 겹치지 않게 심어야 하므로 하나의 꽃(5평) 단위로 DFS 탐색을 해야함
시간 복잡도 : 6<=N<=10 -> O(N^2) -> 완전 탐색
가능
depth
(현재까지 심은 꽃의 개수)가 3이 될 때까지 반복check
: 꽃을 심을 수 있는지 (상하좌우) 확인
plant
: 꽃 심으면서 비용 계산 + 방문 처리 -> cost 반환backtrack
: 방문 처리 되돌림