드디어 했음..
BFS는 근데 아직 어려움 ㅎㅎ
import sys
sys.stdin = open("input.txt", "rt")
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def DFS(x, y):
global cnt
if ch[endPoint[0]][endPoint[1]] == 1:
cnt+=1
else:
for i in range(4):
xx = x + dx[i]
yy = y + dy[i]
if 0 <= xx <= (N-1) and 0 <= yy <= (N-1) and board[x][y] < board[xx][yy] and ch[xx][yy] == 0:
ch[xx][yy] = 1
DFS(xx,yy)
ch[xx][yy]=0
if __name__ == "__main__":
N = int(input())
cnt = 0
board = [list(map(int,input().split())) for _ in range(N)]
ch = [[0]*N for _ in range(N)]
max = -2147000000
min = 2147000000
for i in range(N):
for j in range(N):
if max < board[i][j]:
max = board[i][j]
endPoint = (i,j)
if min > board[i][j]:
min = board[i][j]
startPoint = (i,j)
ch[startPoint[0]][startPoint[1]] = 1
DFS(startPoint[0],startPoint[1])
print(cnt)
이전 문제와 다른 것은, 시작 점과 끝 점이 다르다는 점이다.
또한 값이 점점 커지면서 상하좌우로 움직일 수 있다.
만약 상 하 좌 우 중 현재위치하는 값보다 작은 경우에는 위치 이동이 불가하다.
import sys
sys.stdin = open("input.txt", "rt")
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def DFS(x, y):
global cnt
if x == ex and y == ey:
cnt+=1
else:
for k in range(4):
xx = x + dx[k]
yy = y + dy[k]
if 0 <= xx < N and 0 <= yy < N and board[x][y] < board[xx][yy] and ch[xx][yy] == 0:
ch[xx][yy] = 1
DFS(xx,yy)
ch[xx][yy]=0
if __name__ == "__main__":
N = int(input())
cnt = 0
board = [[0]*N for _ in range(N)] # 지도의 정보를 입력하는 배열
ch = [[0]*N for _ in range(N)]
max = -2147000000
min = 2147000000
for i in range(N):
tmp = list(map(int,input().split())) # 한 줄을 읽는다. min&max 확인용 고정된 배열
for j in range(N):
if tmp[j] < min:
min = tmp[j]
sx=i
sy=j
if tmp[j] > max:
max = tmp[j]
ex=i
ey=j
board[i][j] = tmp[j] # 한 줄을 복사해 놓는다.
ch[sx][sy] = 1
DFS(sx, sy)
print(cnt)
나와 다른 점
1. 변수 이름이 알기 쉽다
2. 배열을 하나 더 만드셨음 >> for문 돌기 용이해보임