hdu 2511 漢諾塔 X 遞迴 構造

2021-07-09 16:11:13 字數 1580 閱讀 4396

簡要題意:中文不表

不妨假設要解決規模為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...