• UVA 10795 新汉诺塔问题


    这是大白书上的例题,刘汝佳的解题方法很巧妙。要把初始盘子移到最终状态,先把最大的盘子安置好,否则无法成功,所以先找到最大的没在最终柱的盘子,先移到该盘子所在柱子上只有该盘子,并且其他盘子都在中转柱上(已经进入最终柱的最大盘子不考虑了),通过一个递归解得到该状态的步数,然后放完该盘子之后,就变成了一个柱子上放剩余盘子,由底向上把剩余的盘子按终态放好,需要用到汉诺塔的一个已知结论就是把一个汉诺塔的所有盘子从一个柱子移到另一个柱子上,需要用2的n次方-1步。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    int n,start[100],fina[100];
    ll f(int* p,int i,int finall)
    {
        if (i==0) return 0;
        if (p[i]==finall) return f(p,i-1,finall);
        ll temp=1;
        return f(p,i-1,6-p[i]-finall)+(temp<<(i-1));
    }
    int main()
    {
        int t=0;
        while (scanf("%d",&n))
        {
            if (!n) break;
            for (int i=1;i<=n;i++)
            {
                scanf("%d",&start[i]);
            }
            for (int j=1;j<=n;j++)
            {
                scanf("%d",&fina[j]);
            }
            int k=n;
            while (k>=1 && start[k]==fina[k]) k--;
            ll ans=0;
            if (k>=1)
            {
                int other =6-start[k]-fina[k];
                ans=f(start,k-1,other)+f(fina,k-1,other)+1;
            }
            printf("Case %d: %lld
    ",++t,ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    学习笔记—Node之读取流的使用与实现
    macbook双系统用U盘离线安装 win10
    CF1634E Fair Share
    CF1632E Distance Tree
    CF1630D Flipping Range
    K8S部署之VMWare网络拓扑踩坑
    ArrayList中的遍历删除
    postgresql提权
    Sqlite数据库的Update知多少?
    C#屏蔽系统热键Ctrl+Alt+Delete的代码尝试。(已修改bug)
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3537332.html
Copyright © 2020-2023  润新知