在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
若是你们有疑问能够留言讨论程序