The “Hanoi Towers” puzzle consists of three pegs (that we will name A, B, and C) with n disks of different diameters stacked onto the pegs. Initially all disks are stacked onto peg A with the smallest disk at the top and the largest one at the bottom, so that they form a conical shape on peg A.
A valid move in the puzzle is moving one disk from the top of one (source) peg to the top of the other (destination) peg, with a constraint that a disk can be placed only onto an empty destination peg or onto a disk of a larger diameter. We denote a move with two capital letters — the first letter denotes the source disk, and the second letter denotes the destination disk. For example, AB is a move from disk A to disk B.
The puzzle is considered solved when all the disks are stacked onto either peg B (with pegs A and C empty) or onto peg C (with pegs A and B empty). We will solve this puzzle with the following algorithm.
All six potential moves in the game (AB, AC, BA, BC, CA, and CB) are arranged into a list. The order of moves in this list defines our strategy. We always make the first valid move from this list with an additional constraint that we never move the same disk twice in a row.
It can be proven that this algorithm always solves the puzzle. Your problem is to find the number of moves it takes for this algorithm to solve the puzzle using a given strategy.
The input file contains two lines. The first line consists of a single integer number n (1 ≤ n ≤ 30) — the number of disks in the puzzle. The second line contains descriptions of six moves separated by spaces — the strategy that is used to solve the puzzle.
Write to the output file the number of moves it takes to solve the puzzle. This number will not exceed 1018.
#1 | 3 AB BC CA BA CB AC |
---|---|
#2 | 2 AB BA CA BC CB AC |
#1 | 7 |
---|---|
#2 | 5 |
这题真是憋了我好久,看代码都看不明白啊啊啊啊 何况题都不明白啊啊啊啊
题的意思是按照他给的顺序操作汉诺塔的碟子 连着的操作不操作同一个盘子
什么意思?好比说对于AB AC都可以操作 但是他给的顺序 是AB在AC的前面 那我就应该优先操作AB (如果条件允许的话)
题解的意思:我记录每组相反操作的优先级 然后比较 AB\AC BC\BA CA\CB的优先级高低 然后套用狭义或者广义的汉诺塔规律╭(╯^╰)╮
看构造数组时候联想到广义版的汉诺塔 狭义的
2077 | 汉诺塔IV (复制过来自带链接好高端 ) |
对于A->B->C->A 或者A->C->B->A 这种环 相当于广义的汉诺塔
而另一种 BC成环的 因为要从A挪过去嘛 步数是狭义的求和了当然正常啦
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll a[35],b[35],c[35]; int f[10]; char s[10]; int main() { int n,i,j,k; a[1]=b[1]=c[1]=1; for(i=2;i<=30;i++) { a[i]=a[i-1]*2+1; c[i]=c[i-1]*3+2; b[i]=b[i-1]+c[i-1]+1; } while(~scanf("%d",&n)){ for(i=1;i<=6;i++) { scanf("%s",s); k=(s[0]-'A')*3+s[1]-'A'; f[k]=i; //优先级 } if(f[1]<f[2]){ if(f[3]<f[5]) printf("%I64d\n",c[n]); else if(f[7]<f[6]) printf("%I64d\n",b[n]); else printf("%I64d\n",a[n]); } else{ if(f[6]<f[7]) printf("%I64d\n",c[n]); else if(f[5]<f[3]) printf("%I64d\n",b[n]); else printf("%I64d\n",a[n]); } } }p.s.困死姐了 大白天写这篇博客一半睡着了 orz 主要原因是早上梦到在开学摸底的考试就得了10.89分 满分100的卷子也是纳闷为啥能得那么有零头的分 而且还是高中最严厉的老师的课 正害怕要重修的时候 惊醒了 去趟卫生间回来就睡不着 而且还记得自己开学摸底考试特别作的觉得自己都会的不复习几乎白卷 (⊙﹏⊙)b 简直就是开学缓考的翻写嘛 ……果然日有所思夜有所梦 高中哪来的重修 ??怎么大学的考试是高中老师?? 还是太禁不住事了
昨天晚上看了两期鲁豫有约 后面的采访国家数学奥林匹克集训队的还是感触挺深的 看之前就对于这群人顶礼膜拜了 而且节目期间 鲁豫一直在强调不要所有人都学台上的这些人 而且后来的某记者也说道 这几个成功孩子的背后是千千万万的被社会、被家长逼着去学奥数的孩子 大多数都是分母 可是却没有说对于分母来说要怎么办?谁又在一开始就觉得自己会是分母还去努力?不都是觉得自己有戏当分子才这样嘛╮(╯_╰)╭还有就是问它们觉得最快乐的是什么 一个答曰三个月做出来一个题 一个答曰 国际奥赛拿了满分 全场鼓掌5分钟 成就感不就这么来的嘛 要么超越了自己 要么功成名就 ;提到国家集训队几年才会有一个女生 鲁豫说 要是本来喜欢数学的女生就少 做到这个程度的女生人少也就不奇怪了况且社会灌输的想法就是女生在理科不占优势
再联想到前几天微信互动话题:喜欢上比自己矮的男生是什么感觉?网友回复说 既然惦记着身高 就说明还不是真爱 就像现在要是总惦记着比赛能不能给我带来物质上的好处 说明你还不是真爱 →_→再说性别问题 貌似林大历史上 现在实验室的男女比例是最丧心病狂的 34个人里面3个女生 ……我不觉得女生在天赋方面差太多(就是有天赋的人少点呗) 主要还是社会灌输的观念太可怕 名校鼓励女生搞ACM也再正常不过 一些女生一开始没败在智力 却败在了传统思想上或者自己的玻璃心上 怪不得环境 要怪就怪自己不争气