zoukankan      html  css  js  c++  java
  • Strange Towers of Hanoi(奇怪的汉诺塔)

    题目

    题目

    做法

    没错,仍然是做法1和做法2

    做法1

    暴力出奇迹!!!!

    我们发现这道题目是四个塔,那我们就四进制表示每个盘子的状态,大概是(2^{24})级别的,用bool数组不会爆炸,然后暴力模拟即可。

    等会,好像是要最小步数,那我们用BFS而且bool改int就可以了,这么简单。

    BFS开个队列,刚好用得上(int)表示状态,空间多大?

    64MB。。。。。

    没错,这个做法是错的,空间卡住了动不了,时间是:(O(2^{24}*12)),也会炸,但是因为每个柱子是单调的,所以实践中会比这个小,但是空间已经炸了,就不尝试了。

    做法2

    递推。

    我们想想,如果三个柱子的汉罗塔怎么做。

    很容易知道,对于两个盘子以上的数量,我们要能移动这些盘子需要至少三根柱子,只有一个盘子移动时只需要两根柱子,因此对于(k)个盘子而言,我们要利用三根柱子先把(k-1)个盘子移动到第二根柱子,然后利用两根柱子把第(k)个盘子放到第(3)跟,再把(k-1)个盘子利用三根柱子移动到第(3)根,归纳一下就是:(f(i)=f(i-1)*2+1)

    那么对于四根柱子而言,对于(k)个盘子,由于(2)个以上的盘子需要(3)根柱子,所以我们虽然可以提前把(i)个盘子放到一个柱子上减少移动压力,但是也最多只能放到一根柱子上。

    所以递推式就出来了:(f_4(n)=f_4(n-i)+f(i))

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #define  N  14
    using  namespace  std;
    int  f3[N],f4[N];
    inline  int  mymin(int  x,int  y){return  x<y?x:y;}
    int  main()
    {
    	f3[1]=1;for(int  i=2;i<=12;i++)f3[i]=f3[i-1]*2+1,f4[i]=999999999;
    	f4[1]=1;
    	for(int  i=2;i<=12;i++)
    	{
    		for(int  j=0;j<i;j++)
    		{
    			f4[i]=mymin(f4[j]*2+f3[i-j],f4[i]);
    		}
    	}
    	for(int  i=1;i<=12;i++)printf("%d
    ",f4[i]);
    	return  0;
    } 
    
  • 相关阅读:
    Gmail、还有人需要吗?
    Google 打不开
    不能忽视的Doctype
    ASP.NET2.0中用ICallbackEventHandler实现客户端与服务器端异步交互
    DataGrid常用小技巧
    ASP.NET程序安全性(三) 表单提交、过滤用户输入
    Objection!!!
    编写3dmax插件需要注意的几个问题
    又一个IGame的bug
    VC2010中的C++0x特性 Part 1:Lambdas,auto, static_assert
  • 原文地址:https://www.cnblogs.com/zhangjianjunab/p/13391594.html
Copyright © 2011-2022 走看看