[BOJ 1074] Z
2024. 11. 18. 11:58ㆍBaekjoon
728x90
- 문제 요약
크기가 2^N x 2^N인 2차원 배열을 Z모양으로 탐색하려고 한다.
아래의 사진은 2^2 x 2^2 크기의 배열을 방문한 순서이다.
N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. (1 ≤ N ≤ 15 / 0 ≤ r, c < 2^N)
- 알고리즘 정리
분할정복을 이용하여 해결했습니다. 2^N 크기의 배열을 십자 모양으로 4등분 해서, 각 블록마다 재귀를 돌려줍니다.
r과 c가 현재 블럭블록 안에 있다면 그 상태로 재귀를 돌리고, 만약 현재 블록 안에 없다면 현재 블록의 크기만큼 탐색을 마치고 다음 블록으로 넘어간다는 소리가 됩니다. 그러므로 현재 블록의 넓이를 결괏값에 더해주면 됩니다.
- 코드 작성
#include<bits/stdc++.h>
using namespace std;
int n,r,c,result;
void f(int x,int y,int w){
if(c==x && r==y){
cout<<result;
return;
}
if(c<x+w && r<y+w && c>=x && r>=y){
f(x,y,w/2);
f(x+w/2,y,w/2);
f(x,y+w/2,w/2);
f(x+w/2,y+w/2,w/2);
}
else{
result+=pow(w,2);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>r>>c;
f(0,0,pow(2,n));
}
728x90
'Baekjoon' 카테고리의 다른 글
[BOJ 15989] 1, 2, 3 더하기 4 (0) | 2024.11.18 |
---|---|
[BOJ 2225] 합분해 (0) | 2024.11.18 |
[BOJ 27496] 발머의 피크 이론 (0) | 2024.09.21 |
[BOJ 11812] K진 트리 (1) | 2023.05.27 |
[BOJ 2186] 문자판 (0) | 2023.05.23 |