汉诺塔多塔问题
这样想,如果把A杆上的一些盘移动到其他只要不是最终目的的杆上(比如B),那么只有在A杆剩下的盘子全都到最终目的杆上,B杆剩下的盘才会轮到去往最终目的杆
ps(废话,B杆上的都比A杆上的小,A杆不移完B杆也不能摞到最终目的杆上面啊)
然后,我们就只用考虑除去B杆以外的过程
然后,就会惊奇的发现,杆少了一个,问题变成了(A-B)个盘子在(杆数-1)上的汉诺塔
然后还是多塔的汉诺塔
然后继续分出来盘子给C
然后可用杆又少了一个
好耶!
反正最终会减到三个杆的,三个杆还不会求吗?
ps(由于不知道分多少给其他杆,所以要全部试一遍,反正我想的分出来两个,然后就WA了)
#include<bits/stdc++.h> using namespace std; int s[20],k[20]; int main(){ s[1]=1; s[2]=3; k[1]=1; for (int i=2;i<=12;i++) k[i]=2*k[i-1]+1; for (int i=3;i<=12;i++){ s[i]=1e8; for (int j=0;j<=i;j++) s[i]=min(2*s[i-j]+k[j],s[i]); } for (int i=1;i<=12;i++) printf("%d\n",s[i]); return 0; }
(markdown不太会用,第一篇题解,有点小激动 o(*≧▽≦)ツ┏━┓)