在NOJ上遇到關於漢諾塔步數的求解問題spa
開始讀時一臉懵逼,甚至不知道輸入的數據是什麼意思3d
題目描述:給出漢諾塔的兩個狀態,從初始狀態移動到目的狀態所須要的最少步數code
對於初級漢諾塔步數問題,咱們能夠直接經過公式進行求解,歸納來講,從一個柱子到另外一個柱子移動n個盤子,須要2的n次方-1步blog
下面看一下輸入的是什麼數據,經過一個例子進行說明get
下面看問題的求解博客
對題目的分析就到這,下面給出具體的程序:io
#include <stdio.h> #include <stdlib.h> #include <math.h> long long fun(int *num,int i,int f) { if(i<0)return 0; if(num[i]==f)return fun(num,i-1,f); return fun(num,i-1,6-num[i]-f)+(1LL<<(i-1)); } int main() { long long ans; int n; int start[60],target[60]; while(scanf("%d",&n)) { if(n==0)break; for(int i = 1;i<=n;i++)scanf("%d",&start[i]); for(int i = 1;i<=n;i++)scanf("%d",&target[i]); int index_end = n; ans = 0; while(index_end>=1 && start[index_end]==target[index_end]){ index_end--; } if(index_end==0){ printf("0\n"); continue; }else{ int other = 6-start[index_end]-target[index_end]; ans = fun(start,index_end-1,other)+fun(target,index_end-1,other)+1; printf("%lld\n",ans); } } return 0; }
第一次博客園的總結就這到這啦class
若是你們有疑問能夠留言討論程序