๋ฌธ์
์ธ ๊ฐ์ ์ฅ๋๊ฐ ์๊ณ ์ฒซ ๋ฒ์งธ ์ฅ๋์๋ ๋ฐ๊ฒฝ์ด ์๋ก ๋ค๋ฅธ n๊ฐ์ ์ํ์ด ์์ฌ ์๋ค. ๊ฐ ์ํ์ ๋ฐ๊ฒฝ์ด ํฐ ์์๋๋ก ์์ฌ์๋ค. ์ด์ ์๋์น๋ค์ด ๋ค์ ๊ท์น์ ๋ฐ๋ผ ์ฒซ ๋ฒ์งธ ์ฅ๋์์ ์ธ ๋ฒ์งธ ์ฅ๋๋ก ์ฎ๊ธฐ๋ ค ํ๋ค.
1. ํ ๋ฒ์ ํ ๊ฐ์ ์ํ๋ง์ ๋ค๋ฅธ ํ์ผ๋ก ์ฎ๊ธธ ์ ์๋ค.
2. ์์ ๋์ ์ํ์ ํญ์ ์์ ๊ฒ์ด ์๋์ ๊ฒ๋ณด๋ค ์์์ผ ํ๋ค.
์ด ์์ ์ ์ํํ๋๋ฐ ํ์ํ ์ด๋ ์์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋จ, ์ด๋ ํ์๋ ์ต์๊ฐ ๋์ด์ผ ํ๋ค.
์๋ ๊ทธ๋ฆผ์ ์ํ์ด 5๊ฐ์ธ ๊ฒฝ์ฐ์ ์์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฒซ ๋ฒ์งธ ์ฅ๋์ ์์ธ ์ํ์ ๊ฐ์ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฎ๊ธด ํ์ K๋ฅผ ์ถ๋ ฅํ๋ค.
๋ ๋ฒ์งธ ์ค๋ถํฐ ์ํ ๊ณผ์ ์ ์ถ๋ ฅํ๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ K๊ฐ์ ์ค์ ๊ฑธ์ณ ๋ ์ ์ A B๋ฅผ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ถ๋ ฅํ๋๋ฐ, ์ด๋ A๋ฒ์งธ ํ์ ๊ฐ์ฅ ์์ ์๋ ์ํ์ B๋ฒ์งธ ํ์ ๊ฐ์ฅ ์๋ก ์ฎ๊ธด๋ค๋ ๋ป์ด๋ค.
์์ ์ ๋ ฅ 1
3
์์ ์ถ๋ ฅ 1
7
1 3
1 2
3 2
1 3
2 1
2 3
1 3
ํ์ด
n๊ฐ์ ์ํ์ 1๋ฒ ์ฅ๋์์ 3๋ฒ ์ฅ๋๋ก ์ฎ๊ธฐ๋ ค๋ฉด
1. n-1๊ฐ์ ์ํ์ 1๋ฒ ์ฅ๋(์ถ๋ฐ)์์ 2๋ฒ ์ฅ๋(์ค๊ฐ)๋ก ์ฎ๊ธด๋ค : ์ฌ๊ท
2. ๊ฐ์ฅ ํฐ ์ํ์ 1๋ฒ ์ฅ๋(์ถ๋ฐ)์์ 3๋ฒ ์ฅ๋(๋์ฐฉ)๋ก ์ฎ๊ธด๋ค
3. n-1๊ฐ์ ์ํ์ 2๋ฒ ์ฅ๋(์ค๊ฐ)์์ 3๋ฒ ์ฅ๋(๋์ฐฉ)๋ก ์ฎ๊ธด๋ค : ์ฌ๊ท
3๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ณ ์ด 2^n + 1๋ฒ ์ด๋์ด ํ์ํ๋ค.
์ ๊ณผ์ ์ ๊ตฌํํ๋ฉด Hanoi(int n, int start, int middle, int goal) ์ด ๋๋ค.
package step10;
import java.io.*;
import java.util.Scanner;
public class B11725 {
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static void Hanoi(int n, int start, int middle, int goal ) throws IOException {
if(n == 1){
bw.write(start + " " + goal + "\n");
} else {
Hanoi(n-1, start, goal, middle);
bw.write(start + " " + goal + "\n");
Hanoi(n-1, middle, start, goal);
}
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
bw.write((int)Math.pow(2, n) - 1 + "\n");
Hanoi(n, 1, 2, 3);
bw.flush();
}
}