https://www.acmicpc.net/problem/1103
1103번: 게임
줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int hole = -99;
private static int max = -1;
private static int n, m;
private static int[][] graph, dp;
private static boolean[][] visited;
private static int[] dx = {1, -1, 0, 0};
private static int[] dy = {0, 0, 1, -1};
private static boolean flag = false;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(bf.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
graph = new int[n][m];
dp = new int[n][m];
visited = new boolean[n][m];
for(int i = 0 ; i < n ; i++) {
String str = bf.readLine();
for(int j = 0 ; j < m ; j++) {
if(str.charAt(j) == 'H') {
graph[i][j] = hole;
} else {
graph[i][j] = str.charAt(j) - '0';
}
}
}
visited[0][0] = true;
dfs(0, 0, 1);
if(flag) {
bw.write("-1");
} else {
bw.write(max + "\n");
}
bf.close();
bw.flush();
bw.close();
}
public static void dfs(int x, int y, int cnt) {
if(cnt > max) {
max = cnt;
}
dp[x][y] = cnt;
for(int i = 0 ; i < 4 ; i++) {
int move = graph[x][y];
int nx = x + (move * dx[i]);
int ny = y + (move * dy[i]);
if(nx < 0 || ny < 0 || nx > n - 1 || ny > m - 1 || graph[nx][ny] == hole) {
continue;
}
if(visited[nx][ny]) {
flag = true;
return;
}
if(dp[nx][ny] > cnt) continue;
visited[nx][ny] = true;
dfs(nx, ny, cnt + 1);
visited[nx][ny] = false;
}
}
}
'코딩테스트' 카테고리의 다른 글
[백준] 1355번 '구멍난 케이크 자르기' - Java (0) | 2023.08.29 |
---|---|
[백준] 1461번 '도서관' - Java (1) | 2023.08.28 |
[백준] 7453번 '합이 0인 네 정수' - Java (1) | 2023.08.26 |
[백준] 1162번 '도로포장' - Java (0) | 2023.08.25 |
[백준] 1234번 '크리스마스 트리' - Java (0) | 2023.08.23 |