最裸的漢諾塔:
第一步:把n-1個盤子移到b柱
第二步:把第n個柱子移到c柱
第三步:把n-1個盤子移到c盤
第一步和第三步是一樣的,如果只需要求最少的步數,可以不管中間步驟,用遞推直接寫出即可
核心**
a[1]=1;
for(int i=2;i<=n;i++)
a[i]=2*a[i-1]+1;
最裸的弄懂當然是遠遠不夠的,現在我們來看一些變形
hdu2175
輸入n,m,問初始有n個盤子,問第m次移動的盤子號
咋看很麻煩,其實也是很簡單的啦!
比如有4個盤子,我要看第4步的盤子。如果我3個盤子都移到目的柱,那一共需要7步,如果把2個盤子都移到目的柱那一共需要3步,所以第4步移動的盤子一定在前3個盤子中。
而我們可以利用這種思想不斷遞推/遞迴也行,直到正好等於把某些盤子移動到目的柱。
#include #include#includeusing namespace std;
typedef long long ll;
ll n,m,a[64],b[64];
void inial()
}int sovle()
if(m==b[t])
return t+1;
m-=b[t-1];
}}int main()
void sovle(int s,int t,int z,int n)
void sovle(int s,int t,int z,int n)
m-=a[k];
int d=(n-k)&1;
if(d==0)
swap(z,t);
if(m==0)
len[s]++;
qu[s].push(k+1);
return;
}len[t]++;
qu[t].push(k+1);
if(m==1)
return;
}m--;
sovle(z,t,s,k);
}int main()
printf("\n");}}
return 0;
}
hdu1995
問題把n個盤子移到目的柱,問第k個盤子在這過程中一共移動了多少次。
看上去很複雜的樣子,但仔細想一想,第n個盤子只需要1次,第n-1個盤子只需要移動2次,你可以這麼遞迴下去,當然有感覺的也可以直接找到規律,不說了,上**
#include #include#include#includeusing namespacestd;typedef
long long
ll;int
t,n,k;intmain
()return
0;}
hdu1996
問n個盤子,移動到目的柱的過程中(不考慮最優的情況)會產生序列的總數,low題,每個哦案子不就可以在三個柱子上麼,3的階層就行了
#include #include#include#includeusing namespace std;
typedef long long ll;
ll a[31];
void inial()
int main()
return 0;
}
上面兩題算是休息,現在來看看更加深入,更加有趣的漢諾塔,hdu1997,自己看題意啊
這題是不是一看到就把人嚇到了,對於這種問題,肯定是遞迴的啦!現在的問題是遞迴什麼,如果你要遞迴每一步,肯定會爆掉。我們要弄清楚我們可以確定什麼,由於最裸的公式,我們可以確定,n在a或c,如果n確定了,那麼我們需要考慮n-1。如果n在a,那還處於最裸的公式中的第一步,那麼n-1只有在a或b,目的柱是b,起點是a,中間點是c。如果n到c,那一定經歷過了第一步,那麼n-1要麼在c要麼在b,起點是b,中間點是a,目的點是c
#include #include#includeusing namespace std;
const int m=70;
int t,n,len[4],a[4][m],no[4],f=-1;
void input()
int main()
for(int i=2;i<=20;i++)
}int main()
{ inial();
int n,m;cin>>n;
for(int i=0;i>m;
cout<
規則又做了一次改變,這次有了四根柱子,這題的難點在於慣性思維(慣性思維害死人啊!!!),大家都用遞推來做,其實是裡面柔和了dp。大家自己感受下來自世界的深深的惡意。
#include #include#includeusing namespace std;
double a[65],b[65];
void inial()
{ b[1]=1;
for(int i=2;i<65;i++)
b[i]=2*b[i-1]+1;
a[1]=1;
a[2]=3;
for(int i=3;i<=64;i++)
{a[i]=b[i];
for(int j=1;j
遞推遞迴 D 漢諾塔系列1
題目 解題思路 實在是學生愚鈍,看了半天題目就是沒看懂什麼意思,但是看樣例輸入與輸出之間可能跟三有關係,用計算機計算了一下3的29次方剛好是第三個輸出。然後就直接寫 了。include using namespace std int main long long i,j,n,k,a 1000 a 1...
HDOJ 漢諾塔系列(遞推分析)
漢諾塔v 設當有n個盤子時,第i個盤子從乙個柱子移到另乙個柱子需要移動的步數為f n,p 則有 當n p時 即p是最底下的那個盤子 f n,p 1 而當n!p時,p要跟著上面n 1個盤子先移動到b柱子,等n移到c後再移到c柱子。所以此時f n,p 2 f n 1,p view code includ...
漢諾塔 遞迴
個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...