汉罗塔1(递归和分治)

题意:有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。

把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘

子始终保持大盘在下,小盘在上。

描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。

解法:设a[n]为将n个盘从A柱移到C柱。将A柱上面n-1个盘看成一个整体。

1、将n-1个盘从A柱移到B柱:a[n-1]。

2、将大盘从A柱移到C柱:1。

3、将n-1个盘从B柱移到C柱:a[n-1]。

根据上面三步得到:a[n] = 2*a[n-1]+1。

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include<time.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF  0x3f3f3f3f
#define mod 20191117
#define PI acos(-1)
using namespace std;
typedef long long ll ;

void solve(int n , char a , char b , char c)
{
    if(n == 0)
        return ;
    else{
        solve(n-1 , a , c , b);
        printf("%d:%c->%c
" , n , a , c);
        solve(n-1 , b , a , c);
    }
}

int main()
{
    /*#ifdef ONLINE_JUDGE
    #else
        freopen("D:/c++/in.txt", "r", stdin);
        freopen("D:/c++/out.txt", "w", stdout);
    #endif*/
    int n ;
    char a  , b , c ;
    scanf("%d" , &n);
    cin >> a >> b >> c ;
    solve(n , a , b , c);

    return 0;
}
原文地址:https://www.cnblogs.com/nonames/p/12015978.html