簡要題意:中文不表
不妨假設要解決規模為n的漢諾塔問題,從from柱子以mid為中介放到to只要將普通的漢諾塔稍加改造就能解決這個問題,只是要左右區間然後逼近結果。有函式solve(int n, int from, int to, int mid)
於是我們可以先把1~n-1的碟子放到mid上:solve(n-1, from, mid, to);
然後我們把最下面的碟子放到to上
然後再把1~n-1從mid放到to上:solve(n-1, mid, to, from);
於是我們可以利用解決更小規模的相同問題來解決的這個問題,也就是遞迴。
漢諾塔問題分為三個階段,可以比較容易看出,第一三階段lr
cnt=
2n−1
−1步,第二階段
1 步。
可以看出來m⩽
lrcn
t時候在第一階段,第二階段就能直接知道結果,第三階段是
m>lr
cnt+
1 。
由於每一步必然是唯一乙個漢諾塔子問題的第二階段,因此只要在這裡輸出就行了。
光記錄規模不夠,要記錄左右的邊界,規模減下出來了。老問題散發新光芒,好題!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
using
namespace
std;
typedef
unsigned
long
long ll;
typedef
vector
vi;
typedef pair pii;
ll powmod(ll a,ll b, ll mod) return res;}
// head
inline ll gethanoi(int x)
void solve(int l, int r, ll m, int from, int to, int mid) else
if (m == lrcnt+1) else
}int main()
return
0;}
漢諾塔 遞迴
個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...
遞迴漢諾塔
遞迴問題 遞迴要有三個要素 1.遞迴結束條件 2.遞迴結束時的處理 3.抽取重複的邏輯,剝離外殼 重點都在這一步 漢諾塔問題 把圓盤從下面開始按大小順序重新擺放在另一根柱子上。且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。首先,要搞這個編碼得要知道漢諾塔的解題思路 1.把a塔上...
遞迴 漢諾塔
漢諾塔問題。這裡順便可以求出一共需要搬運的次數。以下是漢諾塔問題的解法 class hanoi from 搬運的起點,to 搬運的目標地,middle 臨時中轉地 private static int hanoi int level,char from,char to,char middle int...