UVa10795 - A Different Task(递归)
題目鏈接
簡(jiǎn)介:新漢諾塔問題(給出了初始狀態(tài)和目標(biāo)狀態(tài))
分析:
我們考慮最大的盤子,如果這個(gè)盤子初始狀態(tài)和中止?fàn)顟B(tài)在一個(gè)柱子上,說明我們根本不用移動(dòng)ta
那么我們找到編號(hào)最大的需要移動(dòng)是盤子k(初始狀態(tài)所在的柱子和終止?fàn)顟B(tài)不一樣)
假設(shè)k要從x—>y,那么在移動(dòng)k之前三根柱子的狀態(tài)一定是(我們可以忽略那些編號(hào)大于k且不需要移動(dòng)的柱子):
x:k
y:空
z:1~k-1有序擺放
我們稱這種狀態(tài)為中間狀態(tài)
由于盤子的移動(dòng)是可逆的,根據(jù)對(duì)稱性,
問題所需要的步數(shù)就是:(初始狀態(tài)到達(dá)中間狀態(tài)的步數(shù))+(終止?fàn)顟B(tài)到達(dá)中間狀態(tài)的步數(shù))+1
漢諾塔問題有一個(gè)經(jīng)典結(jié)論,不得不提一下:
把n個(gè)有序的盤子由一根柱子全部移動(dòng)到另一根柱子上,所需的步數(shù)是:2^n-1
這就是一個(gè)遞歸的過程,
遞歸的柿子就可以表示為:f(start,i,final)=f(start,i-1,6-final-start[i])+f(finish,i-1,6-final-start[i])+1
start表示初始狀態(tài),finish表示終止?fàn)顟B(tài),final表示需要移動(dòng)到的柱子
我們把柱子依次編號(hào)1,2,3,那么除了初始狀態(tài)和終止?fàn)顟B(tài),剩下的那根柱子的編號(hào)就是6-final-finish[i]
f(P,now,final)表示當(dāng)前的狀態(tài)是P,我們需要把1~now個(gè)盤子全都移動(dòng)到final上
怎么計(jì)算f(P,now,final)呢
如果當(dāng)前的盤子now已經(jīng)在目標(biāo)柱子final上了,那f(P,now,final)=f(P,now-1,final)
如果不在目標(biāo)柱子上,我們就要分成三步:
- 把now-1個(gè)盤子移動(dòng)到(6-final-P[now])
- 把第now個(gè)盤子移動(dòng)到final,需要一步
- 把now-1個(gè)盤子從(6-final-P[now])移動(dòng)到final,注意這里是把now-1個(gè)盤子全部按順序移動(dòng)到final
根據(jù)漢諾塔問題的經(jīng)典結(jié)論,這需要(2^(now-1)-1)步
所以f(P,now,final)=f(P,now-1,6-final-P[now])+2^(now-1)
//這里寫代碼片 #include<cstdio> #include<cstring> #include<iostream> #define ll long longusing namespace std;int n; int start[103],finish[103];ll f(int *P,int now,int final) {if (!now) return 0;if (P[now]==final)return f(P,now-1,final);return f(P,now-1,6-final-P[now])+(1LL << (now-1)); }int main() {int cnt=0;while (scanf("%d",&n)!=EOF&&n){for (int i=1;i<=n;i++) scanf("%d",&start[i]);for (int i=1;i<=n;i++) scanf("%d",&finish[i]);int i=n;while (i>=1&&finish[i]==start[i]) i--;ll ans=0;if (i>=1){ int t=6-start[i]-finish[i];ans=f(start,i-1,t)+f(finish,i-1,t)+1;}printf("Case %d: %lld\n",++cnt,ans);}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/wutongtong3117/p/7673021.html
總結(jié)
以上是生活随笔為你收集整理的UVa10795 - A Different Task(递归)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark Streaming简介
- 下一篇: noip模拟赛 fateice-stri