본문 바로가기
Problem Solving

[DFS] 점프

by Bokoo14 2022. 12. 15.
https://www.acmicpc.net/problem/1890
N * N 숫자판 A에서 개구리가 점프를 한다.
숫자판의 각 셀은 (0, 0) 에서 (n-1, n-1) 이라 한다.
개구리는 각 셀에 적혀 있는 숫자만큼 오른쪽이나 아래쪽으로 점프를 할 수 있다.
개구리는 (0, 0)에서 출발해서 (n-1, n-1)에 도착해야 한다.
정사각형 바깥으로는 점프할 수 없다.
N과 A의 각 셀의 숫자가 주어졌을 때, 개구리가 출발점에도 도착점으로 이동 가능한 지를 출력하시오.
Input
첫째 줄에 양의 정수 N이 주어진다.
둘째 줄부터 N개의 줄에 A의 각 행의 원소 N개가 한 줄에 하나씩 주어진다.
3
1 2 3
2 3 1
3 2 1

3
1 2 3
2 1 2
3 2 1
Output
첫째 줄에 개구리가 출발점에서 도착점까지 이동이 가능하면 "Yes"를 출력한다.
이동이 불가능하면 "No"를 출력한다.
Yes

No

 

# 개구리 탈출 성공: yes 
# 개구리 탈출 실패: no
import sys
input = sys.stdin.readline

# n*n 숫자판
n=int(input())
array = [list(map(int, input().split())) for _ in range(n)]

def dfs(x, y):
    down=False
    right=False
    if x==n-1 and y==n-1: # x=n-1 and y=n-1에 도착
        return True
    else:
        if x+array[x][y]<n: # 개구리 아래로 이동 & 정사각형 바깥으로는 점프할 수 없음
            down=dfs(x+array[x][y], y)
        if y+array[x][y]<n: # 개구리 오른쪽으로 이동 & 정사각형 바깥으로는 점프할 수 없음
            right=dfs(x, y+array[x][y])
    return down or right

if dfs(0, 0):
    print('Yes')
else:
    print('No')

# 개구리 경로 출력
import sys
input = sys.stdin.readline

# n*n 숫자판
n=int(input())
array = [list(map(int, input().split())) for _ in range(n)]

def dfs(x, y, s):
    down=False
    right=False
    if x==n-1 and y==n-1: # x=n-1 and y=n-1에 도착
        return s
    else:
        if x+array[x][y]<n: # 개구리 아래로 이동 & 정사각형 바깥으로는 점프할 수 없음
            down=dfs(x+array[x][y], y, s+"("+str(x+array[x][y])+ ","+str(y)+ ")"+" -> ")
        if y+array[x][y]<n: # 개구리 오른쪽으로 이동 & 정사각형 바깥으로는 점프할 수 없음
            right=dfs(x, y+array[x][y], s+"("+str(x)+ ","+str(y+array[x][y])+")"+" -> ")
    return down or right

# 개구리가 이동할 수 있으면 경로를 출력
if dfs(0, 0, ""):
    print(dfs(0, 0, ""))
# 개구리가 이동할 수 없으면 'No'를 출력
else:
    print('No')

 

 

 

 


개구리가 도착지점까지 갈 수 있는 경로 & 개구리가 도착지점까지 갈 수 있는 경우의 수 출력하고 싶다면....?

#  개구리가 갈 수 있는 모든 가능한 경우의 수 출력 & 개구리가 이동 할 수 있는 경우의 수 
import sys
input = sys.stdin.readline

# n*n 숫자판
n=int(input())
array = [list(map(int, input().split())) for _ in range(n)]
answer=[]
def dfs(x, y, s):
    down=False
    right=False
    if x==n-1 and y==n-1: # x=n-1 and y=n-1에 도착
        answer.append(s)
        return s
    else:
        if x+array[x][y]<n: # 개구리 아래로 이동 & 정사각형 바깥으로는 점프할 수 없음
            down=dfs(x+array[x][y], y, s+"("+str(x+array[x][y])+ ","+str(y)+ ")"+" -> ")
        if y+array[x][y]<n: # 개구리 오른쪽으로 이동 & 정사각형 바깥으로는 점프할 수 없음
            right=dfs(x, y+array[x][y], s+"("+str(x)+ ","+str(y+array[x][y])+")"+" -> ")
    return down or right

# 개구리가 이동할 수 있으면 경로를 출력
if dfs(0, 0, ""):
    print(dfs(0, 0, ""))
# 개구리가 이동할 수 없으면 'No'를 출력
else:
    print('No')

print("------------------------------------------------")
print("개구리가 점프할 수 있는 모든 가능한 경우의 수 출력")
answer = list(set(answer))
for i in range(len(answer)):
    print(answer[i])
print(len(answer))
Output
(1,0) -> (2,0) -> (2,1) -> (2,2) -> 
------------------------------------------------
개구리가 점프할 수 있는 모든 가능한 경우의 수 출력
(1,0) -> (1,1) -> (1,2) -> (2,2) -> 
(0,1) -> (1,1) -> (2,1) -> (2,2) -> 
(1,0) -> (2,0) -> (2,1) -> (2,2) -> 
(0,1) -> (0,2) -> (1,2) -> (2,2) -> 
(1,0) -> (1,1) -> (2,1) -> (2,2) -> 
(0,1) -> (1,1) -> (1,2) -> (2,2) -> 
6

경로 출력 코드2

# 경로 출력하는 코드2
N = int(input())

matrix = [list(map(int, input().split())) for _ in range(N)]
path = []
cnt=0

def DFS(cur_row, cur_col) :
    path.append((cur_row, cur_col))

    if(cur_row==N-1 and cur_col == N-1) :
        print("Yes", end= ' ')
        global cnt
        cnt+=1
        print(*path)

        #quit()

    next_row = cur_row + matrix[cur_row][cur_col]
    next_col = cur_col + matrix[cur_row][cur_col]

    if(next_row < N) :
        #path.append((next_row, next_col))
        DFS(next_row, cur_col)
        path.pop()

    if(next_col < N) :
        #path.append((next_row, next_col))
        DFS(cur_row, next_col)
        path.pop()


DFS(0,0)
print("No")

print(cnt)

'Problem Solving' 카테고리의 다른 글

[Back Tracking] 복면산  (0) 2022.12.15
[DFS] 미로  (0) 2022.12.15
[DFS] 족보  (0) 2022.12.15
[DP] 하나가 되고 싶어  (0) 2022.12.14
[DP] 미로 탈출  (0) 2022.12.14