汉诺塔(河内塔)题解
汉诺塔(河内塔)题解
我们定义
通过手动模拟,可得到
接着我们开始考虑大的情形:怎样才能移动一个大的塔呢?通过移动
这给了我们启发:首先将
用式子表示即:
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull n,T[65];
int main(){cin>>n;
for(int i=1;i<=n;i++)T[i]=2*T[i-1]+1;
cout<<T[n];
}
我们会注意到
发现
所以我们假设
所以又有如下代码,时间复杂度同样是
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull n,pw=1;
int main(){cin>>n;
for(int i=1;i<=n;i++)pw*=2;
cout<<pw-1;
}
空间是优化不了了,再考虑优化时间。我们发现我们推的式子里有
前置知识:
考虑将
所以我们就可以用
#include<bits/stdc++.h> //此代码浅压
#define ull unsigned long long
using namespace std;
ull n;
ull ksm(ull x,ull k){ull sum=1;
while(k){if(k&1)sum*=x;
x*=x,k>>=1;
}
return sum;
}
int main(){
cin>>n,cout<<ksm(2,n)-1;
}
对于这道题实际只需
总结(引用于《具体数学》):汉诺塔的递推(递归)式是在各种应用中出现的诸多问题的典范,在寻求像
(1)研究小的情形,这有助于我们洞察该问题,且对第二第三阶段有所帮助。
(2)对有意义的量求出数学表达式(并证明)。
(3)对数学表达式求出封闭形式(并证明)。
感谢观看,求赞(qwq)。