[白俊]1074:Z
質問する
に答える
import sys
n, r, c = map(int, sys.stdin.readline().split())
result = 0
def sol(n, x, y): # n: 현재 변의 길이, x: 현재 좌표의 행의 위치, y: 현재 좌표의 열의 위치
global result
if x == r and y == c:
print(result)
# 여기에 만약 return result라면 값이 함수로 돌아오기만 하지 sol함수 자체가 끝나는 것이 아님!!
# 다음 라인의 exit(0)이 실행되지도 못하고 다시 함수쪽으로 돌아가서 다음 함수가 실행됨!!
# 그 아래에 재귀함수가 계속 실행됨 (계속 result에 값이 더해짐 but 그러면 안되는 것!)
exit(0)
if n == 1:
result += 1
return # 재귀 호출해준 곳 다음으로 내려감 -> 그래야 더 n을 나누지 않고 다음 사분면으로 좌표를 옮길 수 있음
if not (x <= r <= x+(n-1) and y <= c <= y+(n-1)): # x축에 목표가 없거나 y축에 목표가 없을 때 (드모르간 법칙)
result += n*n
# print(n, result)
return # 더이상 그 함수 볼 필요 없으므로 바로 return 해줌
sol(n//2, x, y) # 제 1사분면의 시작점
sol(n//2, x, y + n//2) # 제 2사분면 // n이 2인 경우 1만 더해져서 2*2인 사각형에서 좌표를 하나씩 옮길 수 있음
sol(n//2, x + n//2, y) # 제 3사분면
sol(n//2, x + n//2, y + n//2) # 제 4사분면
sol(2**n, 0, 0) # (0,0)부터 시작
Reference
この問題について([白俊]1074:Z), 我々は、より多くの情報をここで見つけました https://velog.io/@letsbebrave/백준-1074-Zテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol