삐까냥의 파도타기
Q1520. 내리막길 본문
토요일날 공부하기 힘드네요
플루이드 로직을 활용하여, 경로 개수를 찾는 로직입니다.
map[y][x] = 1로 설정후 mapSearch(1,1) 플루이드 로직을 통해, 경로 찾습니다.
시간 초과가 발생하기 때문에, isVisit 플래그를 추가하여, 한번 탐색한 경로일 경우
재 탐색을 하지 말고 경로를 return 합니다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Q1520 { static long[][][] map; static int y, x; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine());
y = Integer.parseInt(st.nextToken()); x = Integer.parseInt(st.nextToken());
map = new long[2][y+1][x+1]; for (int i = 1; i <= y; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= x; j++) { map[0][i][j] = Integer.parseInt(st.nextToken()); map[1][i][j] = -1; } } map[1][y][x] = 1;
System.out.println(searchValue(1, 1)); }
public static long searchValue(int nowY, int nowX) { //상, 하 , 좌, 우
if (map[1][nowY][nowX] != -1) { return map[1][nowY][nowX]; } map[1][nowY][nowX] = 0;
if (1 < nowY) { if (map[0][nowY][nowX] > map[0][nowY-1][nowX]) { map[1][nowY][nowX] += searchValue(nowY-1, nowX); } }
if (nowY < y) { if (map[0][nowY][nowX] > map[0][nowY+1][nowX]) { map[1][nowY][nowX] += searchValue(nowY+1, nowX); } }
if (1 < nowX) { if (map[0][nowY][nowX] > map[0][nowY][nowX-1]) { map[1][nowY][nowX] += searchValue(nowY, nowX-1); } }
if (nowX < x) { if (map[0][nowY][nowX] > map[0][nowY][nowX+1]) { map[1][nowY][nowX] += searchValue(nowY, nowX+1); } } return map[1][nowY][nowX]; } } |
'코딩 > 백준 알고리즘' 카테고리의 다른 글
Q2156. 포도주 시식 (0) | 2019.02.16 |
---|---|
Q1890. 점프 (0) | 2019.02.16 |
Q11722. 가장 긴 감소하는 부분 수열 (0) | 2019.02.16 |
Q11055. 가장 큰 증가 수열 (0) | 2019.02.14 |
Q11048. 이동하기 (0) | 2019.02.12 |