• [11729] 하노이 탑 이동 순서(C++)

    2020. 4. 27.

    by. 데롱디롱

    728x90

     

    * 접근한 방법
    - 하노이탑 이동의 규칙성을 찾음

    - 하노이탑 개수에 따른 이동 횟수
       :  1개 => 1회,    2개 => 3회,    3개 => 7회,    · · ·    
          ☞ 2 * (n -1)의 하노이 이동 횟수 + 1

    즉, 하노이는 n-1개를 2번에 옮기고 n을 1번에서 3번으로 옮긴 후 다시 n-1개를 2번에서 3번을 옮기는 것과 같음

    hanoi(n - 1, from, to, by);
    path.push_back(make_pair(from, to));
    hanoi(n - 1, by, from, to);

    ex) 하노이 탑 4개는 
         1~3의 하노이를 2번자리에 옮긴 후 
         4번 하노이를 3번자리에 옮기고 
         또 다시 1~3의 하노이를 3번자리로 옮긴다.

     

    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<pair<int, int>> path;
    
    void hanoi(int n, int from, int by, int to)
    {
    	if (n == 1) 
    		path.push_back(make_pair(from, to));
    	else
    	{
    		hanoi(n - 1, from, to, by);
    		path.push_back(make_pair(from, to));
    		hanoi(n - 1, by, from, to);
    	}
    }
    
    int main() {
    	int n;
    	cin >> n;
    
    	hanoi(n, 1, 2, 3);
    	cout << path.size() << "\n";
    	for (int i = 0; i < path.size(); i++)
    	{
    		cout << path[i].first << " " << path[i].second << "\n";
    	}
    }

    '알고리즘 풀이 > 백준' 카테고리의 다른 글

    [4949] 백준 : 균형잡힌 세상(C++)  (0) 2020.04.27
    [10773] 백준 : 제로(C++)  (0) 2020.04.27
    [2447] 백준 : 별 찍기 - 10(C++)  (0) 2020.04.26
    [1002] 백준 : 터렛(C++)  (0) 2020.04.26
    [3053] 택시 기하학(C++)  (0) 2020.04.26

    댓글