728x90
https://www.acmicpc.net/problem/23083
23083번: 꿀벌 승연이
첫째 줄에 \(N\), \(M\)이 공백으로 구분되어 주어진다. 다음 줄에는 구멍 칸의 개수 \(K\)가 주어진다. 이어서 \(K\)개 줄에 구멍 칸의 정보 \(x_i\), \(y_i\)가 공백으로 구분되어 주어진다. 이는 \(i\)번째
www.acmicpc.net
(1,1) 위치에서 N,M 위치까지 갈 수 있는 경우의 수를 모두 구하는 문제이다. 해당 문제는 깊이우선탐색 으로 이미 방문했던 곳을 다시 방문하지 않기 위하여 dp 테이블을 생성하여 메모리제이션 한다. 점화식은 짝수 일때와 홀수 일때 각각 다르다. 움직 일 수 있는 조건을 잘 나누어서 풀면 된다.
import sys
sys.setrecursionlimit(10**9)
N, M = map(int, input().split()) # N은 세로, M은 가로
RESULT = int(1e9 + 7)
table = [[1 for _ in range(M)] for _ in range(N)]
visited = [[-1 for _ in range(M)] for _ in range(N)]
move = [(1,0), (-1,1), (0,1)] # 홀수일때
move2 = [(1,0), (0,1), (1,1)] # 홀수일때
K = int(input()) # 구멍칸의 개수
for _ in range(K):
a, b = map(int, input().split())
table[a-1][b-1] = 0
def dfs(i,j):
if i == N-1 and j == M-1:
visited[i][j] = 1
return 1
if visited[i][j] != -1:
return visited[i][j]
visited[i][j] = 0
for k in range(3):
newy, newx = 0 ,0
if j % 2 == 1: # 홀수일때
newy , newx = move2[k]
else: # 짝수일때
newy , newx = move[k]
dy = i + newy
dx = j + newx
if N > dy >=0 and M > dx >=0 and table[dy][dx] == 1:
visited[i][j] += (dfs(dy,dx) % RESULT)
return visited[i][j]
dfs(0,0)
print(visited[0][0] % RESULT)
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2580번 : 스도쿠 (0) | 2023.07.23 |
---|---|
[백준] 2585번 : 경비행기 (0) | 2023.07.23 |
[백준] 19942번 : 다이어트 (0) | 2023.07.23 |
[백준] 9205번 : 맥주 마시면서 걸어가기 (0) | 2023.07.23 |
[백준] 1107번 : 리모컨 (0) | 2023.07.23 |