https://www.acmicpc.net/problem/2747
์ฒ์ ์์ฑํ ์ฝ๋๋ Recursiveํ๊ฒ ๋ชจ๋ ๊ณต๊ฐ์ ํ์์ ํ์ฌ ์๊ฐ์ด๊ณผ๊ฐ ๋์์ต๋๋ค.
๋๋ฆ๋๋ก ํ์ ์ฑ๊ณต์ ํ๋ฉด ๊ทธ ์ดํ์๋ Recursiveํ๊ฒ ์ดํ์ ํ์์ ํ์ง ์๊ณ return true๋ฅผ ํ๊ฒ ํ์์ผ๋ ๊ทธ๋ผ์๋ ๊ทธ ์ด์ ์ ํ์ํ ๋ด์ฉ์ด ๋ง์์์ธ์ง ์๊ฐ์ด๊ณผ๊ฐ ๋์์ต๋๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int count;
static int row;
static int column;
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
row = Integer.parseInt(st.nextToken());
column = Integer.parseInt(st.nextToken());
recursive((int)Math.pow(2, n), 0, 0);
}
public static boolean recursive(int n, int r, int c) {
if (n == 2) {
if (row ==r && column == c) {
System.out.println(count);
return true;
}
count++;
if (row ==r && column == (c+1)) {
System.out.println(count);
return true;
}
count++;
if (row ==(r+1) && column == c) {
System.out.println(count);
return true;
}
count++;
if (row ==(r+1) && column == (c+1)) {
System.out.println(count);
return true;
}
count++;
return false;
}
if (recursive(n/2, r, c)) return true;
if (recursive(n/2, r, c + n/2)) return true;
if (recursive(n/2, r + n/2, c)) return true;
if (recursive(n/2, r + n/2, c + n/2)) return true;
return false;
}
}
๋ฐํ์ ์๊ฐ์ ์ค์ผ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์ ์งํ๋ก์ด ๊ฐ๋ฐ๋ก๊ทธ์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ต๋๋ค๐ฅ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int count;
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int row = Integer.parseInt(st.nextToken());
int column = Integer.parseInt(st.nextToken());
recursive((int)Math.pow(2, n), row, column);
System.out.println(count);
}
public static void recursive(int n, int r, int c) {
if(n==1)
return;
if (r < n/2 && c < n/2) {
recursive(n/2, r, c);
}
else if (r < n/2 && c >= n/2) {
count += (n * n / 4);
recursive(n/2, r, c-n/2);
}
else if (r >= n/2 && c < n/2) {
count += (n * n / 4) *2;
recursive(n/2, r-n/2, c);
}
else {
count += (n * n / 4) * 3;
recursive(n/2, r-n/2, c-n/2);
}
}
}