import sys
N, L = map(int, input().split())
Map = []; Road = []
for n in range(N):
tmp = list(map(int, sys.stdin.readline()[:-1].split()))
Map.append(tmp)
Road.append(tmp)
for i in range(N):
tmp = []
for j in range(N):
tmp.append(Map[j][i])
Road.append(tmp)
result = 0
for i in range(2 * N):
tmp_result = True; setted = [False for _ in range(N)]; escape = False
for j in range(1, N):
if abs(Road[i][j] - Road[i][j-1]) > 1:
tmp_result = False; break
elif Road[i][j-1] - Road[i][j] == 1:
for k in range(L):
if j+k >= N or setted[j+k] or Road[i][j] != Road[i][j+k]:
tmp_result = False; escape = True; break
if Road[i][j] == Road[i][j+k]:
setted[j+k] = True
if escape:
break
elif Road[i][j] - Road[i][j-1] == 1:
for k in range(L):
if j-k-1 < 0 or setted[j-k-1] or Road[i][j-1] != Road[i][j-k-1]:
tmp_result = False; escape = True; break
if Road[i][j-1] == Road[i][j-k-1]:
setted[j-k-1] = True
if escape:
break
if tmp_result:
result += 1
print(result)
- 조건 문 분기하는 부분이랑 for문 빠져나오는 부분에서 조금 삽질을 했다
- 전반적으로 길을 하나씩 탐색해가면서,
1) 2칸 이상 높아지거나 낮아지는 경우 거르고
2) 1칸 낮아진 경우는 해당 위치의 오른쪽 부분에 경사로를 놓아야 하기 때문에 오른쪽을 L만큼 탐색하고
3) 1칸 높아진 경우는 해당 위치의 왼쪽 부분에 경사로를 놓아야 하기 때문에 왼쪽을 L만큼 탐색해야한다
- 2), 3)의 경우에 오른쪽, 왼쪽을 탐색할 때,
-> 범위를 벗어나거나, 이미 경사로가 설치돼있거나, 높이가 달라지는 경우를 걸러줘야한다
-> 위의 경우에서 걸러지지 않고 높이가 같다면 경사로를 설치해준다 (setted[해당위치] = True)