#문제
https://www.acmicpc.net/problem/21772
#소스코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;
public class BOJ21772 {
public static int R, C, T, x, y;
public static int max = 0;
public static char[][] map;
public static int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
public static HashSet<String> eaten;
public static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
map = new char[R][C];
eaten = new HashSet<String>();
for(int i = 0; i < R; i++){
String s = br.readLine();
for(int j = 0; j < C; j++){
map[i][j] = s.charAt(j);
if(map[i][j] == 'G'){
x = i;
y = j;
}
}
}
}
public static void dfs(int x, int y, int time){
if(time == T) {
max = Math.max(max, eaten.size());
return;
}
for(int[] d : dir){
int nx = x + d[0];
int ny = y + d[1];
if(isValid(nx, ny)){
if(map[nx][ny] == 'S' && !eaten.contains(nx+","+ny)){
eaten.add(nx+","+ny);
dfs(nx, ny, time+1);
eaten.remove(nx+","+ny);
} else {
dfs(nx, ny,time+1);
}
}
}
}
public static boolean isValid(int x, int y){
if(x < 0 || y < 0 || x >= R || y >= C || map[x][y] == '#') return false;
return true;
}
public static void main(String[] args) throws Exception{
input();
dfs(x, y, 0);
System.out.println(max);
}
}
처음에 방문 지점에 대한 중복 체크를 해서 틀렸다.
재방문이 가능한 점을 고려하여 풀어야 한다.
'💡Problem Solving > BOJ' 카테고리의 다른 글
[BOJ 15900] 나무 탈출 (Java) (0) | 2021.10.21 |
---|---|
[BOJ 2056] 작업 (Java) (0) | 2021.10.20 |
[BOJ 21773] 가희와 프로세스 1 (Java) (0) | 2021.10.19 |
[BOJ 22232] 가희와 파일 탐색기 (Java) (0) | 2021.10.18 |
[BOJ 1874] 스택 수열 (Java) (0) | 2021.10.17 |