zoukankan      html  css  js  c++  java
  • 汉罗塔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;
    }
  • 相关阅读:
    .NET5 ABP框架(二)- WebApi
    找不到版本为(>=2.0.3)的包NETStandard.Library -在 Microsoft Visual Stduio Offine Packages 中找到2个版本[ 最接近:1.6.1 ]
    .NET5 ABP框架(一)
    开学第一节课
    开学考试
    参考:
    安装git
    org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.
    hive insert 出现问题
    hive开启远程连接方法
  • 原文地址:https://www.cnblogs.com/nonames/p/12015978.html
Copyright © 2011-2022 走看看