문제를 읽고, 문제 풀이 방법을 생각해내서 실제 코드로 구현 하는 과정
8 * 8 크기의 체스판에 있는 나이트
나이트는 L자 형태로만 이동할 수 있고, 체스판 밖으로 나갈 수 없다
나이트의 이동 방식은 - 수평으로 두 칸 이동한 뒤 수직으로 한 칸 / 수직으로 두 칸 이동한 뒤 수평으로 한 칸 이다
나이트의 현재 위치가 주어지면, 이동할 수 있는 경우의 수를 구하시오
steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (1, 2), (-1, 2), (1, -2), (-1, -2)]
inp = input()
row = int(inp[1])
col = int(ord(inp[0]) - ord('a')) + 1 # 입력 받은 알파벳이 'a'와 얼만큼 차이가 나는지
count = 0
for step in steps:
next_row = row + step[0]
next_col = col + step[1]
if next_row >= 1 and next_row <= 8 and next_col >= 1 and next_col <= 8:
count += 1
print(count)
캐릭터가 있는 장소는 N X M 크기의 직사각형, 각각의 칸은 육지 또는 바다이다
캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다
캐릭터의 이동 룰:
- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 90도)부터 차례대로 갈 곳을 정한다
- 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재하면, 왼쪽 방향으로 회전한 다음 왼쪽으로 한 칸을 전진한다 / 왼쪽 방향에 가보지 않은 칸이 없다면 회전만 한다
- 네 방향이 모두 가본 칸이거나 바다로 되어 있는 칸이면 바라보는 방향을 유지한 채로 한칸 뒤로 간다 / 뒤 쪽도 바다라면 움직임을 멈춘다
N, M = map(int, input().split())
x, y, d = map(int, input().split())
steps = [
[3, 2, 1, 0],
[0, 3, 2, 1],
[1, 0, 3, 2],
[2, 1, 0, 3]]
moves = [(0, 1), (1, 0), (0, -1), (-1, 0)]
count = 0
map = []
for i in range(N):
map.append([])
map[i] = [int(n) for n in input().split()]
map[x][y] = -1
while True:
didMove = False
for i in range(len(steps[d])):
step = steps[d][i]
next_x = x + moves[step][0]
next_y = y + moves[step][1]
if next_x >= 0 and next_x <= N and next_y >= 0 and next_y <= M:
if map[next_x][next_y] == 0:
map[next_x][next_y] = -1
count += 1
x = next_x
y = next_y
d = step
didMove = True
break
if not didMove:
step = steps[d][1]
next_x = x + moves[step][0]
next_y = y + moves[step][1]
if next_x >= 0 and next_x <= N and next_y >= 0 and next_y <= M:
if map[next_x][next_y] != 1:
x = next_x
y = next_y
else:
print(count)
quit()
else:
print(count)
quit()