1.在旧版的汉诺塔中,有n个盘子需要最少的移动步数为 2^(n-1)-1
2.在本题中相当于将所有的不在一个柱子上的盘子先转移到一个柱子上,然后利用旧版汉诺塔,得到答案
3.用6-(当前柱子+想要到的柱子)= 中转柱子
#include<cstdio>
int m,two[25],a[25];
int dfs(int u,int id){
while(id==a[u]&&u)u--;
if(!u)return 0;
return dfs(u-1,6-id-a[u])+two[u-1];
}
int main(){
scanf("%d",&m);
for(int i=20;i>=1;i--)scanf("%d",&a[i]);
two[0]=1;for(int i=1;i<=22;i++)two[i]=two[i-1]*2;
if(dfs(19,a[20])<=m)printf("YES");
else printf("NO");
return 0;
}