题意:有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。
把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘
子始终保持大盘在下,小盘在上。
描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。
解法:整体考虑忽略中间过程。
状态0:A:按顺序堆放n个盘子。B:空 。C: 空。
状态1:A:按顺序堆放1个盘子。B:n-1个盘子。 C:空。
状态2:A:空。B:n-1个盘子。C:1个盘子。
此时可以将C看成是空,因为C的盘子是大于其他座上的盘子。
此时状态与状态0一样只是是从B座移到C座。
状态3:A:空。B:空。C:n个盘子。
定义函数Hanoi(n , a , b , c)表示将n个盘子从a座移到c座。
该操可以分治进行如下三个操作:
1、Hanoi(n-1 , a , c , b)表示将n-1个盘子从a座移到b座。
2、move(a,c)表示将1个盘子从a座移到c座。
3、Hanoi(n-1 , b , a , c)表示将n-1个盘子从b座移到c座
//#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;
}
来源:https://www.cnblogs.com/nonames/p/12015978.html