汉罗塔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" , 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; }