카테고리 없음
[C] 1074: Z
soeayun
2023. 8. 23. 18:58
맨 처음 생각했던건 이차원 배열 graph[40000][40000]을 잡고 돌아다니면서 수를 저장하여 r행 c열을 몇번째로 방문했는지를 확인하는 거였다. 하지만 이렇게 할 경우 512MB라는 메모리 제한에 걸리게 된다.
따라서 DecideSquare이라는 함수를 만들어서 r행 c열까지 재귀적으로 가는 동안 4가지 사각형 중 어디로 가야할지를 정하게 된다면 탐색에 걸리는 시간 뿐만 아니라 메모리도 아끼게 된다.
여기서 주의해야할점은 재귀 함수를 쓸때 각 조건을 잘 살펴야하고 언제 return을 해야하는지를 잘 생각해야한다.
그리고 pow()를 쓸때는 double형 변수를 써야한다!
#include <stdio.h>
#include <math.h>
void recursion(double n,int x,int y,int x_target,int y_target);
int cnt=0;
void DecideSquare(double n,int x,int y,int x_target,int y_target) //어느 4분면으로 갈지 결정
{
if(x_target<x+n/2 && y_target<y+n/2)
recursion(n/2,x,y,x_target,y_target);
else if(x_target>=x+n/2 && y_target<y+n/2)
{
cnt+=n*n/4;
recursion(n/2,x+n/2,y,x_target,y_target);
}
else if(x_target<x+n/2 && y_target>=y+n/2)
{
cnt+=n*n*2/4;
recursion(n/2,x,y+n/2,x_target,y_target);
}
else
{
cnt+=n*n*3/4;
recursion(n/2,x+n/2,y+n/2,x_target,y_target);
}
}
void recursion(double n,int x,int y,int x_target,int y_target) //만족하는 좌표를 찾았는가!
{
if(n>=2) // 더 줄어들 수 있음
{
DecideSquare(n,x,y,x_target,y_target);
}
else
{
printf("%d",cnt);
return;
}
}
int main(void)
{
int y,x;
double n;
scanf("%lf %d %d",&n,&y,&x);
n=pow(2,n);
DecideSquare(n,0,0,x,y);
}