bzoj 1019: [SHOI2008]汉诺塔(打表)

来源:互联网 发布:拼豆转图软件手机 编辑:程序博客网 时间:2024/05/01 21:25

1019: [SHOI2008]汉诺塔

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1770  Solved: 1079
[Submit][Status][Discuss]

Description

  汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成。一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体。

 

  对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的盘子一定放在比它更大的盘子上面(如果移动到空柱子上就不需要满足这个要求)。我们可以用两个字母来描述一次操作:第一个字母代表起始柱子,第二个字母代表目标柱子。例如,AB就是把柱子A最上面的那个盘子移到柱子B。汉诺塔的游戏目标是将所有的盘子从柱子A移动到柱子B或柱子C上面。有一种非常简洁而经典的策略可以帮助我们完成这个游戏。首先,在任何操作执行之前,我们以任意的次序为六种操作(AB、AC、BA、BC、CA和CB)赋予不同的优先级,然后,我们总是选择符合以下两个条件的操作来移动盘子,直到所有的盘子都从柱子A移动到另一根柱子:(1)这种操作是所有合法操作中优先级最高的;(2)这种操作所要移动的盘子不是上一次操作所移动的那个盘子。可以证明,上述策略一定能完成汉诺塔游戏。现在你的任务就是假设给定了每种操作的优先级,计算按照上述策略操作汉诺塔移动所需要的步骤数。

Input

  输入有两行。第一行为一个整数n(1≤n≤30),代表盘子的个数。第二行是一串大写的ABC字符,代表六种操作的优先级,靠前的操作具有较高的优先级。每种操作都由一个空格隔开。

Output

  只需输出一个数,这个数表示移动的次数。我们保证答案不会超过10的18次方。

Sample Input

3
AB BC CA BA CB AC

Sample Output

7


设p[n]表示将n个盘子全部移到另一个柱子上需要多少步,p[1] = 1

答案就是求p[n]

……

当采取最优策略时,p[n] = p[n-1]*2+1

但是这题移动有优先级,那么根据优先级的不同会有三种情况

①p[n] = p[n-1]*2+1

②p[n] = p[n-1]*3

③p[n] = p[n-1]*3+2

只要知道对应哪一种,那么直接递推一下答案就出来了

可以打个表,暴力程序搜索模拟都可以

#include<stdio.h>#include<string.h>#define LL long longchar s7[2344] = {"ABACBCBACACB ABACBCCABACB ABACBCCACBBA ABACCABCBACB ABACCABCCBBA ABACCACBBCBA ABBCACBACACB ABBCACCABACB ABBCACCACBBA ABBCBAACCACB ABBCBACAACCB ABBCBACACBAC ABBCCAACBACB ABBCCAACCBBA ABBCCABAACCB ABBCCABACBAC ABBCCACBACBA ABBCCACBBAAC ABCAACBCBACB ABCAACBCCBBA ABCAACCBBCBA ABCABCACBACB ABCABCACCBBA ABCABCBAACCB ABCABCBACBAC ABCABCCBACBA ABCABCCBBAAC ABCACBACBCBA ABCACBBCACBA ABCACBBCBAAC ACABBABCCBCA ACABBACBBCCA ACABBACBCABC ACABCBBABCCA ACABCBBACABC ACABCBCABABC ACBAABBCCBCA ACBAABCBBCCA ACBAABCBCABC ACBABCABCBCA ACBABCCBABCA ACBABCCBCAAB ACBACBABBCCA ACBACBABCABC ACBACBBCABCA ACBACBBCCAAB ACBACBCAABBC ACBACBCABCAB ACCBABBABCCA ACCBABBACABC ACCBABCABABC ACCBBAABBCCA ACCBBAABCABC ACCBBABCABCA ACCBBABCCAAB ACCBBACAABBC ACCBBACABCAB ACCBCAABBABC ACCBCABAABBC ACCBCABABCAB BAACABBCCBCA BAACABCBBCCA BAACABCBCABC BAACBCABCBCA BAACBCCBABCA BAACBCCBCAAB BAACCBABBCCA BAACCBABCABC BAACCBBCABCA BAACCBBCCAAB BAACCBCAABBC BAACCBCABCAB BABCACABCBCA BABCACCBABCA BABCACCBCAAB BABCCBACABCA BABCCBACCAAB BABCCBCAACAB BACBACABBCCA BACBACABCABC BACBACBCABCA BACBACBCCAAB BACBACCAABBC BACBACCABCAB BACBBCACABCA BACBBCACCAAB BACBBCCAACAB BACBCAACABBC BACBCAACBCAB BACBCABCACAB BCABACBACACB BCABACCABACB BCABACCACBBA BCABBAACCACB BCABBACAACCB BCABBACACBAC BCABCAACBACB BCABCAACCBBA BCABCABAACCB BCABCABACBAC BCABCACBACBA BCABCACBBAAC BCBAABACCACB BCBAABCAACCB BCBAABCACBAC BCBACAABACCB BCBACAABCBAC BCBACACBABAC BCCAABACBACB BCCAABACCBBA BCCAABBAACCB BCCAABBACBAC BCCAABCBACBA BCCAABCBBAAC BCCABAABACCB BCCABAABCBAC BCCABACBABAC BCCACBABACBA BCCACBABBAAC BCCACBBAABAC CAABACBCBACB CAABACBCCBBA CAABACCBBCBA CAABBCACBACB CAABBCACCBBA CAABBCBAACCB CAABBCBACBAC CAABBCCBACBA CAABBCCBBAAC CAABCBACBCBA CAABCBBCACBA CAABCBBCBAAC CABCABACBACB CABCABACCBBA CABCABBAACCB CABCABBACBAC CABCABCBACBA CABCABCBBAAC CABCBAABACCB CABCBAABCBAC CABCBACBABAC CABCCBABACBA CABCCBABBAAC CABCCBBAABAC CACBABACBCBA CACBABBCACBA CACBABBCBAAC CACBBCABACBA CACBBCABBAAC CACBBCBAABAC CBACABBABCCA CBACABBACABC CBACABCABABC CBACBAABBCCA CBACBAABCABC CBACBABCABCA CBACBABCCAAB CBACBACAABBC CBACBACABCAB CBACCAABBABC CBACCABAABBC CBACCABABCAB CBBAACABBCCA CBBAACABCABC CBBAACBCABCA CBBAACBCCAAB CBBAACCAABBC CBBAACCABCAB CBBABCACABCA CBBABCACCAAB CBBABCCAACAB CBBACAACABBC CBBACAACBCAB CBBACABCACAB CBCAACABBABC CBCAACBAABBC CBCAACBABCAB CBCABAACABBC CBCABAACBCAB CBCABABCACAB"};char s9[2344] = {"ABACBCBACBCA ABACBCCBBACA ABACBCCBCABA ABACCBBCBACA ABACCBBCCABA ABACCBCABCBA ABBCACBACBCA ABBCACCBBACA ABBCACCBCABA ABBCBAACCBCA ABBCBACBACCA ABBCBACBCAAC ABBCCBACBACA ABBCCBACCABA ABBCCBBAACCA ABBCCBBACAAC ABBCCBCAACBA ABBCCBCABAAC ABCBACBCBACA ABCBACBCCABA ABCBACCABCBA ABCBBCACBACA ABCBBCACCABA ABCBBCBAACCA ABCBBCBACAAC ABCBBCCAACBA ABCBBCCABAAC ABCBCAACBCBA ABCBCABCACBA ABCBCABCBAAC ACABBCBACBCA ACABBCCBBACA ACABBCCBCABA ACABCBBCBACA ACABCBBCCABA ACABCBCABCBA ACBCABBACBCA ACBCABCBBACA ACBCABCBCABA ACBCBAABCBCA ACBCBACBABCA ACBCBACBCAAB ACBCCBABBACA ACBCCBABCABA ACBCCBBAABCA ACBCCBBACAAB ACBCCBCAABBA ACBCCBCABAAB ACCBABBCBACA ACCBABBCCABA ACCBABCABCBA ACCBBCABBACA ACCBBCABCABA ACCBBCBAABCA ACCBBCBACAAB ACCBBCCAABBA ACCBBCCABAAB ACCBCAABBCBA ACCBCABCABBA ACCBCABCBAAB BCABACBACBCA BCABACCBBACA BCABACCBCABA BCABBAACCBCA BCABBACBACCA BCABBACBCAAC BCABCBACBACA BCABCBACCABA BCABCBBAACCA BCABCBBACAAC BCABCBCAACBA BCABCBCABAAC BCACABBACBCA BCACABCBBACA BCACABCBCABA BCACBAABCBCA BCACBACBABCA BCACBACBCAAB BCACCBABBACA BCACCBABCABA BCACCBBAABCA BCACCBBACAAB BCACCBCAABBA BCACCBCABAAB BCBAABACCBCA BCBAABCBACCA BCBAABCBCAAC BCBAACABCBCA BCBAACCBABCA BCBAACCBCAAB BCBACBABACCA BCBACBABCAAC BCBACBACABCA BCBACBACCAAB BCBACBCAABAC BCBACBCAACAB BCCBABACBACA BCCBABACCABA BCCBABBAACCA BCCBABBACAAC BCCBABCAACBA BCCBABCABAAC BCCBACABBACA BCCBACABCABA BCCBACBAABCA BCCBACBACAAB BCCBACCAABBA BCCBACCABAAB BCCBBAABACCA BCCBBAABCAAC BCCBBAACABCA BCCBBAACCAAB BCCBBACAABAC BCCBBACAACAB BCCBCAABACBA BCCBCAABBAAC BCCBCAACABBA BCCBCAACBAAB BCCBCABAABAC BCCBCABAACAB CBABACBCBACA CBABACBCCABA CBABACCABCBA CBABBCACBACA CBABBCACCABA CBABBCBAACCA CBABBCBACAAC CBABBCCAACBA CBABBCCABAAC CBABCAACBCBA CBABCABCACBA CBABCABCBAAC CBACABBCBACA CBACABBCCABA CBACABCABCBA CBACBCABBACA CBACBCABCABA CBACBCBAABCA CBACBCBACAAB CBACBCCAABBA CBACBCCABAAB CBACCAABBCBA CBACCABCABBA CBACCABCBAAB CBBCABACBACA CBBCABACCABA CBBCABBAACCA CBBCABBACAAC CBBCABCAACBA CBBCABCABAAC CBBCACABBACA CBBCACABCABA CBBCACBAABCA CBBCACBACAAB CBBCACCAABBA CBBCACCABAAB CBBCBAABACCA CBBCBAABCAAC CBBCBAACABCA CBBCBAACCAAB CBBCBACAABAC CBBCBACAACAB CBBCCAABACBA CBBCCAABBAAC CBBCCAACABBA CBBCCAACBAAB CBBCCABAABAC CBBCCABAACAB CBCAABACBCBA CBCAABBCACBA CBCAABBCBAAC CBCAACABBCBA CBCAACBCABBA CBCAACBCBAAB CBCABCABACBA CBCABCABBAAC CBCABCACABBA CBCABCACBAAB CBCABCBAABAC CBCABCBAACAB"};char q[13];LL ans[32] = {0,1};int main(void){int n, i, a, b;while(scanf("%d ", &n)!=EOF){for(i=0;i<=11;i++)scanf(" %c", &q[i]);if(strstr(s7, q)!=NULL)a = 2, b = 1;else if(strstr(s9, q)!=NULL)a = 3, b = 0;elsea = 3, b = 2;for(i=2;i<=n;i++)ans[i] = ans[i-1]*a+b;printf("%lld\n", ans[n]);}return 0;}